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

时间:2014-03-09 12:59:01

标签: c# wpf data-binding 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 ......有没有办法自动完成?

2 个答案:

答案 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