使用Prism Library我已经成功地创建了一个可用的ViewModel。但是,当我尝试设置任何属性时,它不会在视图中显示。
在此示例中,方法OnSumbit将Name设置为" Hello",但这并未在View中显示。如何让它显示在视图中?
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}"/>
答案 0 :(得分:1)
你的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
,然后更改属性以使其看起来类似于viewmodels,即
...
set { SetProperty(ref this.Entry, value); }
...
另一方面,最好(IMO)直接从viewmodel公开这些属性,并将Model仅用作数据对象,因此对我来说,更好的解决方案是:
<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
是一个不幸的名称。我认为最好将其命名为&lt; ViewName&gt; ViewModel,即如果您的视图名为MyView
,则调用viewmodel MyViewModel