2013-05-14 181 views
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-属性?这是一个模型类,我不想仅为更新一个属性创建一个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

如果你绑定了这个值并且希望它在运行时改变,那么你应该真的实现INotifyPropertyChanged,因为WPF的绑定系统使用这个接口来知道它什么时候需要更新。

但有了这样的说法,您或许可以为整个Items集合提出PropertyChange通知,尽管我并不完全确定这是可行的,因为实际集合本身没有改变,只有一个属性集合内的其中一个项目。而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); 

但是,如果真的只是最好在您Item类实现INotifyPropertyChanged

+0

如果String.Empty不起作用,并且添加/删除比我想要做的更加不必要,那么在Item上引发属性更改将不起作用。我想我会为Item类创建一个ItemViewModel包装器。 – SBoss 2013-05-14 13:09:17

+1

@SBoss为什么不在'Item'模型上实现'INotifyPropertyChanged'?为数据项创建包装只是为了实现'INotifyPropertyChanged'似乎是不必要的复杂性。设计模式可以让我们的生活更轻松,通过提供一套经常使开发更容易的指导方针(而不是规则),并且在他们没有意义的情况下盲目地遵守规则并不能真正地使用它们。 – Rachel 2013-05-14 13:12:03

+0

如果一个模型实现INotifyPropertyChanged,我的老板会怪怪的。他是一个强硬的MVVM家伙,我怀疑他会听我解释。不过,感谢您花时间为其他观众解释。 – SBoss 2013-05-14 13:30:07

0

尝试使用:RaisePropertyChanged("Items");,使项目集合的ObservableCollection。

实施INotifyPropertyChanged更好。