我設置的簡單描述:更新綁定屬性
聲明:該代碼只是爲了展示一下我想做的事情。例如命令綁定是通過事件觸發器等完成的。我很確定這不會構建,但我不想浪費空間。
筆者認爲:
<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");
}
}
}
如果String.Empty不起作用,並且添加/刪除比我想要做的更加不必要,那麼在Item上引發屬性更改將不起作用。我想我會爲Item類創建一個ItemViewModel包裝器。 – SBoss 2013-05-14 13:09:17
@SBoss爲什麼不在'Item'模型上實現'INotifyPropertyChanged'?爲數據項創建包裝只是爲了實現'INotifyPropertyChanged'似乎是不必要的複雜性。設計模式可以讓我們的生活更輕鬆,通過提供一套經常使開發更容易的指導方針(而不是規則),並且在他們沒有意義的情況下盲目地遵守規則並不能真正地使用它們。 – Rachel 2013-05-14 13:12:03
如果一個模型實現INotifyPropertyChanged,我的老闆會怪怪的。他是一個強硬的MVVM傢伙,我懷疑他會聽我解釋。不過,感謝您花時間爲其他觀衆解釋。 – SBoss 2013-05-14 13:30:07