我正在使用MVVM模式,在我看来,我有这个dataGrid
:
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource myMultiValueConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="ThisControl" Path="DataContext.MyObservableCollectionInViewModel"/>
<Binding ElementName="thisControl" Path="DataContext.ControlType"/>
<Binding ElementName="ThisControl" Path="DataContext.ExternalItems"/>
<Binding Path="Componentes.OneProperty"/>
</MultiBinding.Bindings>
</MultiBinding>
</Setter.Value>
</Setter>
我的视图模型有这样的代码:
private void myMethod()
{
MyObservableCollectionInViewModel.Clear();
MyObservableCollectionViewModel.Add(new myType());
}
当我执行方法MyMethod()
时,如果一个我没有错,就会运行多值转换器,因为当我添加或删除项目时,ObservableCollection
实现了INotifyPropertyChanged
,但在这种情况下不起作用。
但是,我有另一个ObservableCollection
用于dataGrid
的DataSource
,它按预期工作,当我在ObservableCollection
中添加或删除项目时刷新dataGrid
。
但是,如果在myMethod
我这样做:
private myMethod()
{
myObservableCollectionInMyViewModel.Clear();
myObservableCollectionInMyViewModel.Add(new MyType());
myObservableCollectionInMyViewModel = new ObservableCollection(myObservableCollectionInMyViewModel);
}
它可以工作,因此当我创建新ObservableCollection
时会通知视图,而不是在实际ObservableCollecion
中添加或删除项目时。
是的,这是正确的行为。
ObservableCollection
Add/Remove 适用于 ItemsControl
、ListBox
、DataGrid
等的原因是它们明确地处理了您所描述的行为,这不是特定于 WPF 的,例如:它与ItemsSource
的实际绑定无关。
在掩护下发生的事情是,所有这些控件(ListBox
等(都继承自最终将ItemsSource
包装成CollectionView
ItemsControl
,如果可能的话,这将有利于INotifyCollectionChanged
接口。这就是它知道/跟上的方式。
我成功使用的"解决方法":
A( 只需使用属性更改或像您所做的那样进行交换(这可能或可能不起作用 - 我不完全记得了,但 WPF 可能会显式检查实际值是否已更改,在这种情况下:它没有(:
myObservableCollectionInMyViewModel.Clear();
myObservableCollectionInMyViewModel.Add(new MyType());
RaisePropertyChanged(() => myObservableCollectionInMyViewModel);
二(
myObservableCollectionInMyViewModel =
new ObservableCollection(new List<MyType>{
new MyType()});
C( 绑定 .计数,因为ObservableCollection
会在更改时通知。
<Binding ElementName="ThisControl"
Path="DataContext.MyObservableCollectionInViewModel.Count"/
D(创建一个新的转换器,它将能够侦听所有事件(INotifyPropertyChanged和INotifyCollectionChanged(事件,然后触发多转换器更新。
<Binding ElementName="ThisControl"
Converter="{StaticResource observableConverter}"
Path="DataContext.MyObservableCollectionInViewModel"/>