2013-08-27 17 views
11

Ho faticato a salvare il valore selezionato della mia casella combinata quando si opera all'interno di un datagrid. Quando faccio una soluzione di prova senza datagrid, le cose funzionano bene. Il contesto sono nomi di persone con paesi associati. I paesi sono memorizzati in un file xml. Ecco un'istantanea della vista iniziale:MVVM WPF ComboBox SelectedItem Rilegatura non attivata all'interno del datagrid

Combobox with country names

che vedete qui i (parti importanti del) PersonList.xaml:

<UserControl.Resources> 
     <XmlDataProvider x:Key="Dataxml" Source="\Properties\AllCountries.xml" /> 
     <model:Person x:Key="Person"/> 
    </UserControl.Resources> 
    <UserControl.DataContext> 
     <viewModel:PersonListViewModel /> 
    </UserControl.DataContext> 

<DataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" SelectionUnit="FullRow" SelectedItem="{Binding SelectedPerson}" > 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="Name" Binding="{Binding Name}" CanUserSort="true" ></DataGridTextColumn> 
          <DataGridTemplateColumn Header="Country"> 
           <DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <ComboBox 
               Width="150" 
               SelectedValuePath="country" 
               IsSynchronizedWithCurrentItem="True" 
               ItemsSource="{Binding Source={StaticResource Dataxml}, XPath=/countries/country}" 
               SelectedIndex="{Binding CountryIndex}" 
               SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}"> 
              <ComboBox.ItemTemplate> 
               <DataTemplate> 
                <TextBlock> 
                 <TextBlock.Text> 
                  <MultiBinding StringFormat="{}{0}, {1}"> 
                   <Binding XPath="name" /> 
                   <Binding XPath="iso" /> 
                  </MultiBinding> 
                 </TextBlock.Text> 
                </TextBlock> 
               </DataTemplate> 
              </ComboBox.ItemTemplate> 
             </ComboBox> 
            </DataTemplate> 
           </DataGridTemplateColumn.CellTemplate> 
          </DataGridTemplateColumn> 
         </DataGrid.Columns> 
        </DataGrid> 

Questa griglia è popolata da una PersonListViewModel, che ha un attributo privato ObservableCollection<Person> _persons che implementa INotifyPropertyChanged ed è ItemsSource per la griglia. Puoi vedere anche lo SelectedItem="{Binding SelectedPerson}" nella griglia. Quella parte funziona bene.

La classe del modello Persona ha CountryIndex (stringa, indice nel file xml, calcolato), Paese (stringa, il nome del paese) e ora ho implementato l'attributo XmlCountry (XmlElement, il xmlnode nel file xml. file XML assomiglia a questo:.

?xml version="1.0" encoding="utf-8"?> 
<countries> 
    <country> 
    <iso>AF</iso> 
    <name>Afghanistan</name> 
    </country> 
    <country> 
    <iso>AL</iso> 
    <name>Albania</name> 
    </country> 
    <country> 
    <iso>DZ</iso> 
    <name>Algeria</name> 
    </country> 
    <country> 
    <iso>AS</iso> 
    <name>American Samoa</name> 
    </country> 
    <country> 
    <iso>AD</iso> 
    <name>Andorra</name> 
    </country> 
etc, etc, .... 

Quando carico le persone nel costruttore ViewModel nome del paese della persona viene utilizzata per calcolare l'indice di paese che viene utilizzato per impostare i valori iniziali, come si vede nella schermata i raggiunto questo utilizzando il SelectedIndex="{Binding CountryIndex}" nella xaml sopra.

E poi il problema è iniziato, non riesco a t la selezione dei paesi nella casella combinata per chiamare qualsiasi cosa sul modello Person O su PersonListViewModel. Ho provato quasi tutto ...: P

E 'ovvio che la chiave per la soluzione è questa associazione nella casella combinata:

SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}" 

La proprietà 'XmlCountry' qui risiede nel modello Person. Ho provato a inserirlo nello PersonListViewModel senza fortuna. Il pulsante "Salva persona" funziona correttamente, prende la proprietà associata "SelectedPerson" e invia al database. Tranne che non ottiene il valore combobox aggiornato.

Appletterei qualsiasi aiuto sull'associazione SelectedItem/SelectedIndex nella casella combinata. E anche altri suggerimenti: ho bisogno di un PersonViewModel per includere la classe del modello Person? Dovrei creare un attributo "AllCountries" sul mio PersonListViewModel dal file xml e usare quello al posto del file xml direttamente?

Grazie mille in anticipo!

UPDATE:

Come sospettavo: Il diavolo era nell'impostazione SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}".

Quando ho cambiato a:

SelectedItem="{Binding XmlCountry, **UpdateSourceTrigger=PropertyChanged**}"

tutto funziona bene. Ora sto passando i dati giusti al mio metodo "Salva persona". Però; è la prima volta che ho dovuto impostare UpdateSourceTrigger per mantenere la visualizzazione e il viewmodel sincronizzati ....

risposta

10

Basta parafrasare l'aggiornamento dalla domanda precedente e inserirla in una risposta effettiva.

Il diavolo era nel SelectedItem = "{Binding Path = XmlCountry, Mode = TwoWay}" impostazione.

Quando cambio l'elemento selezionato legame:

SelectedItem="{Binding XmlCountry, **UpdateSourceTrigger=PropertyChanged**}" 

... tutto funziona bene.

Problemi correlati