1

在给定属性上将ItemsControl.ItemsSource 绑定到2 个不同来源的最佳/优雅方法是什么?

绑定应仅对 2 个集合之一进行,ItemsControl 绑定到的集合的选择应基于某些属性。

我有一个绑定到 ViewModel 的视图。我要绑定的集合位于该 ViewModel 下的不同层次结构路径中。

我有一个基于 MultiBinding 的解决方案,但我认为应该有更优雅的解决方案。

<CollectionViewSource x:Key="CVS">
      <CollectionViewSource.Source  >
          <MultiBinding Converter="{StaticResource myMultiBindingConverter}">
              <Binding  Path="XXXX.YYYY.ObservableCollection1"  />
              <Binding Path="XXXX.ObservableCollection2" />                    
          </MultiBinding>
      </CollectionViewSource.Source>                            
</CollectionViewSource>

<ListBox  x:Name="myListBox"                                   
          ItemsSource="{Binding Source={StaticResource CVS}}" />

转换器:

public class myMultiBindingConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {

        foreach (var item in values)
        {
            if(myDependecyProperty == getFirstCollection)
            {
              //make sure the item is of first collection type based on its item property
              return item;
             }
            else
            {
              //make sure the item is of the second collection type
              return item;
            }

        }
        return null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
4

1 回答 1

5

ADataTrigger在这里可能更合适,因为您想ItemsSource根据另一个值更改绑定

<Style x:Key="MyListBoxStyle" TargetType="ListBox">
    <Setter Property="ItemsSource" Value="{Binding XXX.ObservableCollection2}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding SomeValue}" Value="SecondCollection">
            <Setter Property="ItemsSource" Value="{Binding XXX.YYY.ObservableCollection2}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

与转换器不同,DataTrigger只要触发值发生变化,就会正确地重新评估a

于 2013-05-09T11:50:02.133 回答