级联绑定更新的简单方法
本文关键字:简单 方法 更新 绑定 级联 | 更新日期: 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");
}
}