2013-05-08 5 views
1

2 개 데이터 소스 사이에서 전환?방법은 주어진 특성에 가장 <strong>2</strong> 다른 소스에 ItemsControl.ItemsSource을 결합 할 수있는 <strong>최고의/우아한</strong> 방법은 무엇 ListBox.ItemsSource

바인딩은 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(); 
    } 
} 
+1

왜'ViewModel'에는 두 개의 콜렉션을 결합하는 속성이 포함되어 있지 않습니까? 결국, 그것을 모델로하기로되어 있습니다 :) – Rachel

+0

@Rachel 나는 어떤 컬렉션을 선택할 수있게하고 싶습니다 조건에이 2 컬렉션베이스 중 하나에 바인딩되고 싶습니다 – makc

+1

그 경우, a 조건이 바뀔 때'ItemsSource' 속성을 올바르게 재평가 할 것이므로'DataTrigger'가 더 적절할 수도 있습니다. – Rachel

답변

4

DataTrigger 다른 값

<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> 
A 컨버터와 달리

하는 DataTrigger에 따라 바인딩 ItemsSource을 변경하려면 때문에 아마 여기에 더 적합 할 것 트리거 된 값이 변경 될 때마다 다시 평가됩니다.