2013-05-14 232 views
0

我設置的簡單描述:更新綁定屬性

聲明:該代碼只是爲了展示一下我想做的事情。例如命令綁定是通過事件觸發器等完成的。我很確定這不會構建,但我不想浪費空間。

筆者認爲:

<ItemsControl ItemsSource="{Binding Items}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding IsFavorite, Converter={StaticResource FavoriteConverter}" Tap="{Binding FavoriteCommand, CommandParameter={Binding}}"/> 
       <TextBlock Text="{Binding Title}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

我的視圖模型:

public class ViewModel : ViewModelBase 
{ 
    public IList<Item> Items { get; set; } 
    public RelayCommand<Item> Favorite 
    { 
     get 
     { 
      return new RelayCommand<Item>(item => 
       { 
        item.IsFavorite = !item.IsFavorite; 
        RaisePropertyChanged(string.Empty); 
       }; 
     } 
    } 
} 

我的模型:

public class Item 
{ 
    public string Title { get; set; } 
    public bool IsFavorite { get; set; } 
} 

* 我的問題: *

如何在不實施INotifyPropertyChanged的情況下更新IsFavorite-屬性?這是一個模型類,我不想僅爲更新一個屬性創建一個ViewModel。我認爲用一個空字符串調用PropertyChanged會更新所有內容,但可惜它沒有。

* 我的解決方案: *

public class ItemViewModel : ViewModelBase 
{ 
    public Item Model { get; private set; } 
    public bool IsFavorite 
    { 
     get { return Model.IsFavorite; } 
     set 
     { 
      Model.IsFavorite = value; 
      RaisePropertyChanged("IsFavorite"); 
     } 
    } 
} 

回答

2

如果你綁定了這個值並且希望它在運行時改變,那麼你應該真的實現INotifyPropertyChanged,因爲WPF的綁定系統使用這個接口來知道它什麼時候需要更新。

但有了這樣的說法,您或許可以爲整個Items集合提出PropertyChange通知,儘管我並不完全確定這是可行的,因爲實際集合本身沒有改變,只有一個屬性集合內的其中一個項目。而WPF通常不知道如果實際上沒有改變,就不要再重新評估一個屬性。

RaisePropertyChanged("Items"); 

如果它不工作,你很可能刪除該項目並重新添加它來觸發CollectionChange通知,但也可能無法工作,並可能導致依賴於應用程序的設計等問題。

// I may have the exact syntax wrong here 
var index = Items.IndexOf(item); 
var tmp = Items[index]; 
Items.Remove(tmp); 
Items.Add(tmp, index); 

但是,如果真的只是最好在您Item類實現INotifyPropertyChanged

+0

如果String.Empty不起作用,並且添加/刪除比我想要做的更加不必要,那麼在Item上引發屬性更改將不起作用。我想我會爲Item類創建一個ItemViewModel包裝器。 – SBoss 2013-05-14 13:09:17

+1

@SBoss爲什麼不在'Item'模型上實現'INotifyPropertyChanged'?爲數據項創建包裝只是爲了實現'INotifyPropertyChanged'似乎是不必要的複雜性。設計模式可以讓我們的生活更輕鬆,通過提供一套經常使開發更容易的指導方針(而不是規則),並且在他們沒有意義的情況下盲目地遵守規則並不能真正地使用它們。 – Rachel 2013-05-14 13:12:03

+0

如果一個模型實現INotifyPropertyChanged,我的老闆會怪怪的。他是一個強硬的MVVM傢伙,我懷疑他會聽我解釋。不過,感謝您花時間爲其他觀衆解釋。 – SBoss 2013-05-14 13:30:07

0

嘗試使用:RaisePropertyChanged("Items");,使項目集合的ObservableCollection。

實施INotifyPropertyChanged更好。