【发布时间】:2018-02-22 15:05:07
【问题描述】:
我有以下视图模型:
public class ViewModel: INotifyPropertyChanged
{
public ObservableCollection<Item> Items { get; set; }
...
}
public class Item: INotifyPropertyChanged
{
public SubItem A { get; set; }
public SubItem B { get; set; }
...
}
public class SubItem: INotifyPropertyChanged
{
public bool Valid { get; set; }
...
}
xaml:
<ListBox ItemsSource="{Binding Items}" ..>
如果我想显示文本"Valid item",如果A.Valid 和B.Valid 都是true,那么:
-
我可以通过在视图中添加逻辑(项目数据模板)来做到这一点,例如使用可见性和额外的容器:
<Grid Visibility="{Binding A.Valid}" Converter=...> <TextBlock Text="Valid item" Visibility="{Binding B.Valid}" Converter=... \> </Grid> -
或者我可以向项目视图模型添加一个新属性:
public class Item: INotifyPropertyChanged { public bool Valid => A.Valid && B.Valid; // bind to this ... }问题是
SubItem的任何一个通知都不会更新视图。
在 (1) 的情况下,绑定将订阅 PropertyChanged 事件:Item 和相应的 SubItem。在 (2) 的情况下,绑定只知道 Item.Valid 属性,所以我必须这样做:
public class Item: INotifyPropertyChanged
{
SubItem _a;
public SubItem A
{
get { return _a; }
set
{
_a.PropertyChanged -= bla;
_a = value;
_a.PropertyChanged += bla;
OnPropertyChanged(nameof(A));
OnPropertyChanged(nameof(Valid));
}
}
void bla(object sender, PropertyChangedEventArgs e) =>
OnPropertyChanged(nameof(Valid));
...
}
这太糟糕了。所以我更喜欢(1)(有时使用数据触发器,但这无关紧要)。
是否有其他选项可以实际拥有 viewmodel 属性 (2) 但没有麻烦?
【问题讨论】:
标签: c# wpf mvvm propertychanged