如何将控件绑定到 List<string>?
How can I bind a control to a List<string>?
似乎是一个非常基本的 MVVM 问题,但是当涉及到 Catel 时,我遇到了问题。
- 我有一个 属性 - 按应有的方式注册 - 这是一个名为 Lines 的列表。
- 我将它绑定到一个列表框。
- 我还有一个按钮,其中包含一个命令,用于向行添加一个条目。
- Lines 映射到模型,当我检查模型的值时,我发现在向 Lines 添加值时它得到了正确更新。
所以一切似乎都正常,除了 修改 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.
似乎是一个非常基本的 MVVM 问题,但是当涉及到 Catel 时,我遇到了问题。
- 我有一个 属性 - 按应有的方式注册 - 这是一个名为 Lines 的列表。
- 我将它绑定到一个列表框。
- 我还有一个按钮,其中包含一个命令,用于向行添加一个条目。
- Lines 映射到模型,当我检查模型的值时,我发现在向 Lines 添加值时它得到了正确更新。
所以一切似乎都正常,除了 修改 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.