更新ItemsControl中的绑定属性

时间:2013-05-14 12:46:46

标签: c# xaml mvvm

我的设置的简要说明:

免责声明:该代码仅用于显示我想要做的事情。例如,命令绑定是通过事件触发器等完成的。我很确定这甚至不会构建,但我不想浪费空间。

我的观点:

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

2 个答案:

答案 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更好。