为什么转换器没有运行?

时间:2014-12-12 09:43:33

标签: c# mvvm datagrid observablecollection imultivalueconverter

我正在使用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); } 添加或删除项目时通知。

1 个答案:

答案 0 :(得分:1)

是的,这是正确的行为。

ObservableCollection添加/删除适用于ItemsControlListBoxDataGrid等的原因是它们明确地处理您所描述的行为,不是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}}