级联绑定更新的简单方法

本文关键字:简单 方法 更新 绑定 级联 | 更新日期: 2023-09-27 17:56:12

刚刚在我的MVVM应用程序中遇到了一个障碍,这让我怀疑我是否在做MVVM"正确",或者我是否错过了某个技巧。在视图模型上考虑这样的情况:

private _bookings ObservableCollection<Booking>;
public ObservableCollection<Booking> Bookings
{
    get { return _bookings; }
    set
    {
        _bookings = value;
        OnPropertyChanged("Bookings");
    }
}
public int Requested
{
    get
    {
        return (int)Bookings.Sum(g => g.Requested);
    }
}
public int Available
{
    get
    {
        return (int)Bookings.Sum(g => g.Volume);
    }
}

然后在视图上的数据网格中:

<DataGrid DataContext="{Binding Bookings, Mode=TwoWay}" ItemsSource="{Binding SourceCollection}">
    <!-- various datagrid related gubbins -->
</DataGrid>
<Label BorderThickness="1" Content="{Binding Requested}"></Label>
<Label BorderThickness="1" Content="{Binding Available}"></Label>

现在,每当 ViewModel 中的某些内容更改 Bookings 集合的内容时,我的网格的内容都会自动更新,这很棒。

但是,基于该集合的内容计算的"活动"和"请求"属性不会自动更新,并且不能自动更新,因为它们是只读的。即使我以两种方式制作了每个代码并为它们都引发了一个更改事件(我不愿意这样做,因为在实际版本中有很多这些依赖属性),代码在执行时也会阻塞,因为您无法对只读属性进行双向绑定。

是否有任何直接的解决此问题的方法,理想情况下是将更改级联到依赖属性并让它们在视图中自动更新?

级联绑定更新的简单方法

就像@dellywheel在他的回答中提到的,如果您希望绑定到这些属性的控件获得更改通知,则需要级联属性更改。

但是,如果您正在处理小类并且可以承受属性更改,则可以使用空字符串引发PropertyChanged事件,以便类中的所有属性都将属性更改通知传递给 UI。这样,您就不必为每个属性引发单独的属性更改事件。

OnPropertyChanged("");

您需要在 Bookings 集合更改后(或代码中需要的任何位置)引发 OnPropertyChanged。

private _bookings ObservableCollection<Booking>;
public ObservableCollection<Booking> Bookings
{
    get { return _bookings; }
    set
    {
        _bookings = value;
        OnPropertyChanged("Bookings");
        OnPropertyChanged("Requested");
        OnPropertyChanged("Available");        
    }
}