2010-03-16 3 views
8

Ho due Combobox e entrambi hanno l'associazione con la stessa Sorgente.WPF Binding Combobox

<ComboBox ItemsSource="{Binding Source={StaticResource UsersViewSource}}" 

E quando cambio qualcosa nel primo, si riflette anche sul secondo. E non so come mantenere i loro valori SelectedItem separatamente, usando la stessa ItemsSource.

risposta

10

La proprietà IsSynchronizedWithCurrentItem deve essere impostata su False:

vero se il SelectedItem è sempre sincronizzato con l'attuale articolo in l'ItemCollection; false se l'oggetto selezionato non viene mai sincronizzato con l'elemento corrente; null se l'oggetto selezionato è sincronizzato con l'elemento corrente solo se il selettore utilizza un CollectionView. Il valore predefinito è null.

Ecco un esempio:

<Page 
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"> 
    <Page.Resources> 
     <x:Array x:Key="myStrings" Type="sys:String"> 
     <sys:String>one</sys:String> 
     <sys:String>two</sys:String> 
     <sys:String>three</sys:String> 
     <sys:String>four</sys:String> 
     <sys:String>five</sys:String> 
     </x:Array> 
    </Page.Resources> 

<StackPanel Width="200"> 
    <ComboBox IsSynchronizedWithCurrentItem="False" Margin="25" 
    ItemsSource="{Binding Source={StaticResource myStrings}}" /> 

    <ComboBox IsSynchronizedWithCurrentItem="False" Margin="25" 
    ItemsSource="{Binding Source={StaticResource myStrings}}" /> 
</StackPanel> 

</Page> 
+3

L'ironia della tua risposta è che - come spiega la tua citazione - il 'IsSynchronizedWithCurrentItem =" False "' nel tuo codice citato è completamente inutile, perché non sei vincolante per un 'CollectionView'. Se togli questi attributi, le caselle combinate non sono ancora collegate. –

+0

Concordato che potrebbe non essere l'esempio migliore, ma impostare il valore su True e si sincronizzano come se fossero associati a un CollectionView (la mia ipotesi). Se in effetti questo non funziona con un CollectionView, allora significa che eliminerò la risposta e andrò via imparando qualcosa da me stesso. –

+0

Ha unito un progetto rapido e verificato per vedere se la proprietà IsSynchronizedWithCurrentItem funzionerà con un CollectionView e funziona davvero. Certo, la mia risposta non è esattamente corretta, ma fornisce un rapido esempio di Kaxaml;) –

0

È possibile associare separatamente la proprietà SelectedItem per ogni casella combinata separatamente.

cioè

SelectedItem={Binding SelectedItem1} 

questo modo quando di ognuno elemento viene impostato, viene memorizzato in un posto diverso.

1

direi (dal nome del vostro vincolante) che la ragione per questo sta accadendo è che si sta legandosi a un CollectionViewSource (che avvolge un collezione). Questa classe è un proxy utilizzato da WPF che include (tra le altre cose) l'elemento selezionato di una raccolta. Ovviamente se condividi questa raccolta tra due caselle combinate, condividi anche l'elemento selezionato.

Se si imposta ItemsSource a qualcosa che non è un CollectionViewSource, il controllo andrà a capo automaticamente in uno. Quindi, il mio suggerimento sarebbe quello di associare direttamente a una raccolta invece di eseguire il wrapping in un CollectionViewSource - o, in alternativa, creare due istanze CollectionViewSource, una per ogni ComboBox.