我正在使用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
的{{1}},我还有另一个DataSource
,并且按照预期的方式工作,当我从{{添加或删除项目时刷新dataGrid
1}}。
但是,如果在dataGrid
我执行此操作:
ObservableCollection
它有效,因此我在创建新myMethod
时会收到通知,而不是在我从实际private myMethod()
{
myObservableCollectionInMyViewModel.Clear();
myObservableCollectionInMyViewModel.Add(new MyType());
myObservableCollectionInMyViewModel = new ObservableCollection(myObservableCollectionInMyViewModel);
}
添加或删除项目时通知。
答案 0 :(得分:1)
是的,这是正确的行为。
ObservableCollection
添加/删除适用于ItemsControl
,ListBox
,DataGrid
等的原因是它们明确地处理您所描述的行为,不是WPF特定的,例如:它与ItemsSource
的实际绑定无关。
封面下发生了什么,所有这些控件(ListBox
等)继承自ItemsControl
,最终将ItemsSource
包装到CollectionView
中,这将占用INotifyCollectionChanged
如果可能, myObservableCollectionInMyViewModel.Clear();
myObservableCollectionInMyViewModel.Add(new MyType());
RaisePropertyChanged(() => myObservableCollectionInMyViewModel);
接口的优势。这就是它如何知道/保持。
&#34;解决方案&#34;我成功使用了:
A)只需更改属性或进行交换(这可能会或可能不会起作用 - 我不会完全记住,但WPF可能会明确检查实际值是否已经改变了,在这种情况下:它没有&#t; t):
myObservableCollectionInMyViewModel =
new ObservableCollection(new List<MyType>{
new MyType()});
B)
ObservableCollection
C)绑定.Count,因为 <Binding ElementName="ThisControl"
Path="DataContext.MyObservableCollectionInViewModel.Count"/
会在发生变化时通知。
<Binding ElementName="ThisControl"
Converter="{StaticResource observableConverter}"
Path="DataContext.MyObservableCollectionInViewModel"/>
D)创建一个新的转换器,它将能够监听所有事件(INotifyPropertyChanged和INotifyCollectionChanged)事件,然后触发多转换器更新。
{{1}}