如何让视图显示属性

本文关键字:显示 属性 视图 | 更新日期: 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视图永远不会通知的变化,所以,这里最简单的解决方案是使ItemTemplateModelBindableBase继承,然后改变属性,使它们看起来类似于视图模型,即

...
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是一个不合适的名称。我认为最好将它命名为ViewModel,即,如果你的视图命名为MyView,调用ViewModel MyViewModel