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-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");
        }
    }
}
4

2 回答 2

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班级上实施。

于 2013-05-14T12:54:30.200 回答
0

尝试使用:RaisePropertyChanged("Items");并使 Items 集合 ObservableCollection。

实施 INotifyPropertyChanged 更好。

于 2013-05-14T12:54:12.590 回答