刷新MVVM中的只读(链接)属性

时间:2010-05-13 14:35:38

标签: wpf mvvm properties readonly

我认为这应该很容易,但我似乎无法解决这个问题。

从示例ViewModel中获取这些属性(ObservableViewModel实现INotifyPropertyChanged):

class NameViewModel : ObservableViewModel
{ 
    Boolean mShowFullName = false;
    string mFirstName = "Wonko";
    string mLastName = "DeSane";
    private readonly DelegateCommand mToggleName;

    public NameViewModel()
    {
        mToggleName = new DelegateCommand(() => ShowFullName = !mShowFullName);
    }

    public ICommand ToggleNameCommand
    {
        get { return mToggleName; }
    }

    public Boolean ShowFullName
    {
        get { return mShowFullName; }
        set { SetPropertyValue("ShowFullName", ref mShowFullName, value); }
    }

    public string Name
    {
        get { return (mShowFullName ? this.FullName : this.Initials); }
    }

    public string FullName
    {
        get { return mFirstName + " " + mLastName; }
    }

    public string Initials
    {
        get { return mFirstName.Substring(0, 1) + "." + mLastName.Substring(0, 1) + "."; }
    }
}

这样的内容[在此处插入您的形容词]使用此ViewModel的视图可能如下所示:

<TextBlock x:Name="txtName"
           Grid.Row="0"
           Text="{Binding Name}" />

<Button x:Name="btnToggleName"
        Command="{Binding ToggleNameCommand}"
        Content="Toggle Name"
        Grid.Row="1" />

我看到的问题是触发ToggleNameCommand。 ShowFullName属性由命令正确更新,但Name绑定永远不会在View中更新。

我错过了什么?如何强制绑定更新?我是否需要将Name属性实现为DependencyProperties(因此派生自DependencyObject)?对我来说似乎有点重量级,我希望有一个更简单的解决方案。

谢谢, WTS

1 个答案:

答案 0 :(得分:1)

您需要显式通知Name已更改,否则Binding系统无法知道。您可以在设置ShowFullName时为属性“Name”调用NotifyPropertyChanged,也可以将Name属性修改为具有私有setter并显式更新它(将NotifyPropertyChanged作为Name属性setter的一部分调用),而不是让getter计算a功能


请注意,您需要为其他两个只读属性执行相同的操作。使它们成为依赖属性也可以,但我更愿意避免这些,除非我实现了一个控件,它将成为Binding的目标。如果你只需要改变财产通知,它们就会很重。