如何自动通知 ListView 其绑定属性已更改,MVVM 的方式?



如何自动通知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#版本,你将不得不使用硬编码字符串。(或者用表达式变魔术,但这要复杂得多)

许多MVVM框架都有一个基类来实现INotifyPropertyChanged

相关内容

  • 没有找到相关文章

最新更新