0

我正在使用 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,它按预期工作,当我从.DataSourcedataGriddataGridObservableCollection

但是,如果myMethod我这样做:

private myMethod()
{
    myObservableCollectionInMyViewModel.Clear();
    myObservableCollectionInMyViewModel.Add(new MyType());
    myObservableCollectionInMyViewModel = new ObservableCollection(myObservableCollectionInMyViewModel);
}

它可以工作,所以当我创建一个新的时,视图会被通知ObservableCollection,而不是当我从实际的ObservableCollecion.

4

1 回答 1

1

是的,这是正确的行为。

ObservableCollectionAdd/Remove 适用于ItemsControl,ListBox等的原因DataGrid是它们明确处理您所描述的行为,这不是 WPF 特定的,例如:它与ItemsSource.

幕后发生的事情是,所有这些控件(ListBox等)都继承自ItemsControl最终包装ItemsSource成的,如果可能的话CollectionView,这将利用INotifyCollectionChanged接口。这就是它知道/跟上的方式。

我成功使用的“解决方法”:

A)只需使用已更改的属性或进行交换(这可能会或可能不会起作用 - 我不完全记得,但 WPF 可能会明确检查实际值是否已更改,在这种情况下:它没有):

 myObservableCollectionInMyViewModel.Clear();
 myObservableCollectionInMyViewModel.Add(new MyType());
 RaisePropertyChanged(() => myObservableCollectionInMyViewModel);

二)

myObservableCollectionInMyViewModel = 
   new ObservableCollection(new List<MyType>{
      new MyType()});

C) 绑定.Count,ObservableCollection当它改变时会通知。

     <Binding ElementName="ThisControl" 
Path="DataContext.MyObservableCollectionInViewModel.Count"/

D) 创建一个新的转换器,它将能够监听所有事件(INotifyPropertyChanged 和 INotifyCollectionChanged)事件,然后将触发多转换器更新。

<Binding ElementName="ThisControl" 
   Converter="{StaticResource observableConverter}"
   Path="DataContext.MyObservableCollectionInViewModel"/>
于 2014-12-12T10:11:32.947 回答