2010-05-13 72 views
2

我在想這應該很容易,但我似乎無法弄清楚這一點。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

回答

1

你需要明確通知名稱發生了變化,否則綁定系統沒有辦法知道。您可以在設置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

相關問題