代码之家  ›  专栏  ›  技术社区  ›  Wonko the Sane

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

  •  2
  • Wonko the Sane  · 技术社区  · 14 年前

    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" />
    

    我看到的问题是togglename命令何时被触发。ShowFullName属性由命令正确更新,但视图中的名称绑定从未更新。

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

    谢谢, 水处理系统

    1 回复  |  直到 14 年前
        1
  •  1
  •   Dan Bryant    14 年前

    您需要显式地通知名称已更改,否则绑定系统无法知道。您可以在设置ShowFullName时为属性“Name”调用NotifyPropertyChanged,也可以修改Name属性以拥有私有setter并显式更新它(作为Name属性setter的一部分调用NotifyPropertyChanged),而不是让getter对函数求值。


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