MVVM中令人耳目一新的(链式)属性

MVVM中令人耳目一新的(链式)属性

问题描述:

我在想这应该很容易,但我似乎无法弄清楚这一点。MVVM中令人耳目一新的(链式)属性

从一个例子视图模型(ObservableViewModel实现INotifyPropertyChanged)采取这些属性:

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

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

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) + "."; } 
    } 
} 

使用该视图模型可能看起来像这样的[在这里插入您的形容词]查看胆量我看到的问题是触发了ToggleNameCommand。 ShowFullName属性由命令正确更新,但名称绑定永远不会在View中更新。

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

感谢, WTS

你需要明确通知名称发生了变化,否则绑定系统没有办法知道。您可以在设置ShowFullName时为属性“名称”调用NotifyPropertyChanged,或者可以修改Name属性以使私有setter明确更新(将NotifyPropertyChanged作为Name属性设置器的一部分调用),而不是让getter评估功能。


请注意,您需要为其他两个只读属性执行相同的操作。使它们依赖属性也可以工作,但我更喜欢避免这些,除非我正在实现一个控件,它将成为绑定的目标。如果您只需要更改财产通知,那么它们很重。

+0

Doh!当然! +1给你,-1给我。 :) 至少我对DP的实施是正确的,也是避免它的原因。 – 2010-05-13 14:56:38

+1

我以前遇到过这个问题,因为当您有多个属性是同一基础数据的不同视图时,这是一个常见问题。我倾向于追随得到;私人设置;这些天来处理并将更新封装在RefreshX方法中,只要其中一个基础属性发生更改。这对我来说比较干净,因为我使用PostSharp来实现INotifyPropertyChanged,这样我就不需要创建一个新的显式OnPropertyChanged调用。 – 2010-05-13 15:00:31