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

How can I bind a control to a List<string>?

似乎是一个非常基本的 MVVM 问题,但是当涉及到 Catel 时,我遇到了问题。

所以一切似乎都正常,除了 修改 Lines 后我的视图没有更新

我试图通过 在 Lines 的 setter 中添加一个 RaisePropertyChanged("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) => {});

这是命令(是的,我在视图模型的构造函数中有 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");
}

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

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

1) RaisePropertyChanged(() => Lines) => 将更新整个集合 2) 使用 ObservableCollection 而不是 List 因此 UI 可以实际响应更新

我推荐2.