如何让视图显示属性
本文关键字:显示 属性 视图 | 更新日期: 2023-09-27 18:02:28
使用Prism库,我已经成功地创建了一个工作的ViewModel。然而,当我尝试设置任何属性时,它不会显示在视图中。
在这个例子中,OnSumbit方法将Name设置为"Hello",但这不会显示在视图中。我怎样才能让它显示在视图中?
class ItemTemplateVM : BindableBase
{
private ItemTemplateModel itemTemplateModel;
public ICommand SubmitCommand { get; private set; }
public ItemTemplateVM()
{
this.SubmitCommand = new DelegateCommand(this.OnSubmit);
this.ItemTemplateModel = new ItemTemplateModel();
}
private void OnSubmit()
{
this.ItemTemplateModel.Name = "Hello";
}
public ItemTemplateModel ItemTemplateModel
{
get { return this.itemTemplateModel; }
set { SetProperty(ref this.itemTemplateModel, value); }
}
XAML
<TextBox Height="23" TextWrapping="Wrap" Text="{Binding ItemTemplateModel.Entry, Mode=TwoWay}"/>
<TextBox Height="23" TextWrapping="Wrap" Text="{Binding ItemTemplateModel.Name, Mode=TwoWay}"/>
<TextBox Height="23" TextWrapping="Wrap" Text="{Binding ItemTemplateModel.Displayid, Mode=TwoWay}"/>
<Button Content="Button" Command="{Binding SubmitCommand}"/>
在您的xaml
中有三个绑定<TextBox Text="{Binding ItemTemplateModel.Entry, Mode=TwoWay}"/>
<TextBox Text="{Binding ItemTemplateModel.Name, Mode=TwoWay}"/>
<TextBox Text="{Binding ItemTemplateModel.Displayid, Mode=TwoWay}"/>
,它们都直接绑定到对象ItemTemplateModel
的属性。由于该类不触发PropertyChanged
视图永远不会通知的变化,所以,这里最简单的解决方案是使ItemTemplateModel
从BindableBase
继承,然后改变属性,使它们看起来类似于视图模型,即
...
set { SetProperty(ref this.Entry, value); }
...
另一方面,最好(IMO)直接从视图模型中公开这些属性,并将模型单独用作数据对象,所以对我来说,更好的解决方案是:
<TextBox Text="{Binding Entry, Mode=TwoWay}"/>
<TextBox Text="{Binding Name, Mode=TwoWay}"/>
<TextBox Text="{Binding Displayid, Mode=TwoWay}"/>
.
class ItemTemplateVM : BindableBase
{
private ItemTemplateModel itemTemplateModel;
...
public ItemTemplateModel ItemTemplateModel
{
get { return this.itemTemplateModel; }
set { SetProperty(ref this.itemTemplateModel, value); }
}
public string Entry {
get { return itemTemplateModel.Entry; }
set {
if (itemTemplateModel.Entry == value)
return;
itemTemplateModel.Entry = value;
RaisePropertyChanged(); // I believe this is the prism variant of firing PropertyChanged
}
}
// same for Name and DisplayId
另外,请注意WPF中有一个名为DataTemplate的概念,因此将通用ViewModel命名为ItemTemplateViewModel
是一个不合适的名称。我认为最好将它命名为MyView
,调用ViewModel MyViewModel