如何将控件绑定到List <string>?</string>

时间:2015-01-15 14:17:34

标签: c# wpf mvvm inotifypropertychanged catel

看起来像一个非常基本的MVVM问题,但是当谈到Catel时,我遇到了问题。

  • 我有一个属性 - 应该注册 - 这是一个List,名为Lines。
  • 我将它绑定到ListBox。
  • 我还有一个按钮,其中有一个命令为Lines添加一个条目。
  • 行被映射到模型,当我检查模型的值时,我看到在向行添加值时它会正确更新。

所以一切似乎都有效,除了我的视图在修改线条时没有更新

我试图通过在Lines的setter中添加一个RaisePropertyChanged(“Lines”)以及在Lines中添加新值的命令来解决这个问题。

它为这个属性提供了类似的东西:

[ViewModelToModel("MyModel", "Lines")]
public List<string> Lines
{
    get { return GetValue<List<string>>(LinesProperty); }
    set
    {
        SetValue(LinesProperty, value);
        RaisePropertyChanged("Lines");
    }
}

public static readonly PropertyData LinesProperty =
    RegisterProperty("Lines", typeof(List<string>), null, (s, e) => {});

和命令的这个(是的,我在viewmodel的构造函数中有AddLine = new Command(OnAddLineExecute);):

public Command AddLine { get; private set; }
private async void OnAddLineExecute()
{
    // this doesn't seem relevant, but since we're talking async and stuff, that may as well be the issue
    if (!lineCountChecked && Lines.Count >= 4)
    {
        if (await messageService.Show(MainDialogs.LineCountCheck, "Lines count", MessageButton.OKCancel, MessageImage.Warning) != MessageResult.OK)
            return;
        else
            lineCountChecked = true;                    
    }
    //

    Lines.Add("New Line");
    RaisePropertyChanged("Lines");
}

这很可能是一个非常愚蠢的错误,但我无法得到它。我错过了什么?感谢

1 个答案:

答案 0 :(得分:2)

您有2个选项可以完成这项工作:

1)RaisePropertyChanged(()=&gt; Lines)=&gt;将更新整个集合 2)使用ObservableCollection而不是List,这样UI实际上可以响应更新

我推荐2。