为什么转换器没有运行



我正在使用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用于dataGridDataSource,它按预期工作,当我在ObservableCollection中添加或删除项目时刷新dataGrid

但是,如果在myMethod我这样做:

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

它可以工作,因此当我创建新ObservableCollection时会通知视图,而不是在实际ObservableCollecion中添加或删除项目时。

是的,这是正确的行为。

ObservableCollection Add/Remove 适用于 ItemsControlListBoxDataGrid 等的原因是它们明确地处理了您所描述的行为,这不是特定于 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"/>

相关内容

  • 没有找到相关文章

最新更新