只是在我的MVVM应用程序中遇到了障碍,让我想知道我是否正在做MVVM"对#34;或者如果我在某个地方错过了一个技巧。在viewmodel上考虑这样的情况:
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集合的内容,我的网格内容就会自动更新,这很棒。
但根据该集合的内容计算的“有效”和“请求”属性不会自动更新,因为它们是只读的,因此无法进行更新。即使我以两种方式制作每一个并且为它们两者提出了一个改变的事件(我不愿意这样做,因为在真实版本中有很多这些依赖属性),代码在执行时会窒息你不能对只读属性进行双向绑定。
是否有任何直接解决此问题的方法,理想情况是级联对属性的更改并让它们在视图中自动更新?
答案 0 :(得分:2)
与他的回答中提到的@dellywheel一样,如果您希望绑定到这些属性的控件获取更改通知,则需要级联属性更改。
但是,如果您正在处理小类并且可以负担属性更改,则可以使用空字符串引发PropertyChanged
事件,以便类中的所有属性都将属性更改通知传递给UI 。这样您就不必为每个房产筹集个别房产变更事件。
OnPropertyChanged("");
答案 1 :(得分:0)
您需要在预订集合更改后(或代码中的任何位置)引发OnPropertyChanged。
private _bookings ObservableCollection<Booking>;
public ObservableCollection<Booking> Bookings
{
get { return _bookings; }
set
{
_bookings = value;
OnPropertyChanged("Bookings");
OnPropertyChanged("Requested");
OnPropertyChanged("Available");
}
}