我设置的简单描述:更新绑定属性
声明:该代码只是为了展示一下我想做的事情。例如命令绑定是通过事件触发器等完成的。我很确定这不会构建,但我不想浪费空间。
笔者认为:
<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