我的设置的简要说明:
免责声明:该代码仅用于显示我想要做的事情。例如,命令绑定是通过事件触发器等完成的。我很确定这甚至不会构建,但我不想浪费空间。
我的观点:
<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>
我的ViewModel:
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-Property?它是一个模型类,我不想创建一个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");
}
}
}
答案 0 :(得分:2)
如果您绑定了该值并期望它在运行时更改,那么您应该真正实现INotifyPropertyChanged
,因为WPF的绑定系统使用该接口来了解它何时需要更新。
但话虽如此,您可能会为整个PropertyChange
集合提出Items
通知,但我不完全确定这会有效,因为实际的集合本身没有没有改变,只是集合中其中一个项目的属性。如果一个属性实际上没有改变,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);
但最好在INotifyPropertyChanged
课程上实施Item
。
答案 1 :(得分:0)
尝试使用:RaisePropertyChanged("Items");
并生成Items集合ObservableCollection。
实现INotifyPropertyChanged更好。