如何自动通知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 ......有没有办法自动完成?
答案 0 :(得分:1)
如果Storehouse和Units依赖,它们可能应该在同一个Viewmodel中。
然后,您可以将ViewModel放在View的DataContext中,并通过确定正确的绑定路径绑定到Storehouse和Units。
更换仓库是对ViewModel的更改,它也可以更新单元,或者您可以设置一个全新的ViewModel并将其分配给DataContext。
答案 1 :(得分:1)
将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 ) );
}
}
请注意在CallerMemberName
参数上使用propertyName
; C#编译器会将该参数值替换为您调用该方法的成员的名称,例如我们的示例中为Things
。这对于避免使用硬编码字符串非常有用,如果更改属性名称,则会导致忘记更改它们的风险。这在.NET 4.5的C#5中可用;如果您使用较旧的C#版本,则必须使用硬编码字符串。 (或者用表达做魔术,但这样做要复杂得多)
许多MVVM框架都有一个基类来轻松实现INotifyPropertyChanged
。