2009-03-04 11 views
2

Ich habe eine WPF ComboBox, die zu einer Sammlung datengebunden ist, aber abhängig davon, ob ein Kontrollkästchen aktiviert ist oder nicht möchte ich variieren, an welche Sammlung die ComboBox gebunden ist.Ändern Sie Datenbindung auf WPF ComboBox, wenn Kontrollkästchen Wert ändert

Das grundlegende Problem ist, ich habe eine große Sammlung von MyCustomer und ich habe auch eine gefilterte Sammlung von MyCustomer - die Filterung ist ziemlich intensiv und ich möchte es nicht mit einer CollectionView für den Hauptgrund, dass es bereits ist fertig, die gefilterte Sammlung existiert bereits - daher muss die Datenbindung der Combo einfach umgeschaltet werden.

Ich hoffe auf eine reine XAML-Lösung, offensichtlich schreiben einige Code hinter wäre eine relativ einfache Lösungen, aber es fühlt sich nicht wie es erforderlich sein sollte.

Antwort

5

Hier ist ein Beispiel eines Datatrigger mit den Sammlungen wechseln:

<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel.Resources> 
     <x:Array x:Key="notes" Type="{x:Type sys:String}"> 
      <sys:String>do</sys:String> 
      <sys:String>re</sys:String> 
      <sys:String>mi</sys:String> 
     </x:Array> 
     <x:Array x:Key="letters" Type="{x:Type sys:Char}"> 
      <sys:Char>a</sys:Char> 
      <sys:Char>b</sys:Char> 
      <sys:Char>c</sys:Char> 
     </x:Array> 
    </StackPanel.Resources> 

    <CheckBox x:Name="chkLetters" Content="Use Letters"/> 
    <ListBox> 
     <ListBox.Style> 
      <Style TargetType="{x:Type ListBox}"> 
       <Setter Property="ItemsSource" Value="{StaticResource notes}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsChecked, ElementName=chkLetters}" Value="True"> 
         <Setter Property="ItemsSource" Value="{StaticResource letters}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Style> 
    </ListBox> 
</StackPanel> 

Für Sie würde dies nicht verschiedene Arrays sein, aber wahrscheinlich verschiedene CollectionViewSources mit Filtern oder etwas, aber das Prinzip ist das gleiche.

2

Das Beste, was ich weiß, ist, eine Shell-Sammlung zu verwenden, die intern die richtige Sammlung erhält.

Sie haben also Ihre UnfilteredCollection und Ihre FilteredCollection und dann eine Eigenschaft namens BindingCollection, die in ihrem 'Getter' einen Zustand auswertet (das Kontrollkästchen wäre an diesen Zustand gebunden), um festzustellen, welche Sammlung abgerufen werden soll.

Wenn Sie MVVM für die Datenbindung zwischen der Benutzeroberfläche und den Sammlungen zu verwenden, eine Möglichkeit, es zu tun, so sein würde:

<!-- Your ComboBox binds to some shell collection --> 
<ComboBox ItemsSource="{Binding BindingCollection}" /> 
<!-- The input to this item will determine which collection is internally exposed --> 
<CheckBox IsChecked="{Binding UseFilteredSet}" /> 

Und dann haben Sie Ihre Viewmodel (Mittelschicht) Datei so etwas tun (ich bin auch nicht die Details der Implementierung von INotifyPropertyChanged, aber ich kann wenn Sie möchten):

private ObservableCollection<MyCustomer> UnfilteredCollection 
{ 
    get { return _unfilteredCollection; } 
} 

private ObservableCollection<MyCustomer> FilteredCollection 
{ 
    get { return _filteredCollection; } 
} 

// The public collection to which your ComboBox is bound 
public ObservableCollection<MyCustomer> BindingCollection 
{ 
    get 
    { 
     return UseFilteredSet ? 
      FilteredCollection : 
      UnfilteredCollection; 
    } 
} 

// CheckBox is bound to this state value, which tells the bindings on the shell 
// collection to refresh when the value of this state changes. 
public bool UseFilteredSet 
{ 
    get { return _useFilteredSet; } 
    set 
    { 
     _useFilteredSet = value; 
     OnPropertyChanged("UseFilteredSet"); 
     OnPropertyChanged("BindingCollection"); 
    } 
} 
+0

Dank KP - Ich hatte gestern diesen Gedanken, aber hoffte auf eine 'reinere' XAML-Lösung - vielleicht bin ich den falschen Baum bellen und eine reine XAML-Lösung ist nicht der richtige Weg, um Dinge in der ersten gehen Ort. – Scott

+0

Nun, die einzige andere Sache, die mir in den Sinn kommt, ist eine Art triggerbasierter Ansatz, der die 'ItemsSource'-Eigenschaft basierend auf der IsChecked-Eigenschaft der Checkbox ändert, aber ich weiß nicht, wie das funktioniert. – Adrian

Verwandte Themen