如何让我的视图显示该属性?

时间:2015-07-12 09:55:36

标签: c# wpf mvvm

使用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}"/>

1 个答案:

答案 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