如何自动通知ListView它的绑定属性已经改变,MVVM的方式?
相关后台代码:public partial class MainWindow : Window
{
public DataModel StoreHouse { get; set; }
public ObservableCollection<Units> Devices { get { return StoreHouse.Units; } }
/*
... rest of the code ...
*/
}
XAML绑定:<ListView Name="UnitsListView" ItemsSource="{Binding Devices}">
当我这样做时:
StoreHouse = newDeserializedStoreHouse
Units
属性不再有效。现在我可以使用DependencyProperty
,并这样做:
StoreHouse = newDeserializedStoreHouse
Units = StoreHouse.Units;
但它不是MVVM-ish…有办法自动完成吗?
如果仓库和单元是相互依赖的,它们应该在同一个视图模型中。
然后你可以把ViewModel放在视图的DataContext中,并通过指定正确的绑定路径绑定到仓库和单元。
替换仓库是对ViewModel的更改,也可以更新单元,或者您可以设置一个全新的ViewModel并将其分配给DataContext。
使用INotifyPropertyChanged
为您的属性,例如:
private ObservableCollection<Thing> _things;
public ObservableCollection<Thing> Things
{
get { return _things; }
private set
{
if ( _things != value )
{
_things = value;
OnPropertyChanged();
}
}
}
public PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged( [CallerMemberName] string propertyName = "" )
{
var evt = PropertyChanged;
if ( evt != null)
{
evt( this, new PropertyChangedEventArgs( propertyName ) );
}
}
注意在propertyName
参数上使用CallerMemberName
;c#编译器会将该参数值替换为调用该方法的成员的名称,例如在我们的示例中Things
。这对于避免硬编码字符串很有用,因为硬编码字符串会在更改属性名称时带来忘记更改它们的风险。这在。net 4.5的c# 5中是可用的;如果你使用旧的c#版本,你将不得不使用硬编码字符串。(或者用表达式变魔术,但这要复杂得多)
INotifyPropertyChanged
。