2017-07-12 1 views
1

Kollabieren Ich habe ein GridView whith DataGridComboBoxColumn, es in Ordnung das erste Mal funktioniert, aber wenn die Säule visibility-collapsed gesetzt und ihn dann wieder visibility zu visible wieder, die Säule ihren Wert verlieren. aber die Eigenschaft, die an sie gebunden ist, hat immer noch den richtigen Wert.Datagrid DataGridComboBoxColumn verlieren ihren Wert nach

Wenn der DataContext aktualisiert wird, werden alle Werte korrekt verknüpft.

Ich habe einen Testkonverter hinzugefügt und festgestellt, dass beim Zurücksetzen der Spalte die Rückrufmethode ausgelöst wird und der Wert null ist.

<DataGridComboBoxColumn SelectedValueBinding="{Binding DbId}" 
         DisplayMemberPath="Name" 
         SelectedValuePath="Id" 
         Visibility="Visible"> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding TestList}"/> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
    <DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding TestList}"/> 
     </Style> 
    </DataGridComboBoxColumn.EditingElementStyle> 
</DataGridComboBoxColumn> 
+0

Sie müssen INotifyPropertyChanged auf TestList implementieren, so dass die Benutzeroberfläche die Änderung widerspiegelt. – CodeConstruct

+0

bereits implementiert und funktioniert gut, aktualisiert der Datenkontext alle Werte korrekt aktualisiert. – IBRA

+0

können Sie weitere Codeinformationen posten? Konverter ich meine – CodeConstruct

Antwort

1

Ich kann Ihr Problem reproduzieren.

<DataGridComboBoxColumn.ElementStyle> 
    <Style TargetType="ComboBox"> 
     <Setter Property="ItemsSource" Value="{Binding TestList}"/> 
     <EventSetter Event="Loaded" Handler="OnLoaded" /> 
    </Style> 
</DataGridComboBoxColumn.ElementStyle> 

private void OnLoaded(object sender, RoutedEventArgs e) 
{ 
    ComboBox cmb = sender as ComboBox; 
    dynamic dataObject = cmb.DataContext; 
    cmb.SelectedValue = dataObject.DbId; 
} 

Eine andere Lösung, die DataGridComboBoxColumn mit einem DataGridTemplateColumn zu ersetzen wäre: Sie könnten durch den Umgang mit den Loaded Ereignis für die ComboBox im CellTemplate und wieder stellen Sie die SelectedValue Eigenschaft um ihn herum arbeiten. Sie möchten dann die SelectedItem-Eigenschaft der ComboBox an eine Db-Eigenschaft Ihres Datenobjekts binden, um die Name-Eigenschaft des Db-Objekts in der CellTemplate anzuzeigen.

+0

on Loaded Ich habe gerade den DataContext aufgerufen und OnPropertyCanged ausgelöst und es funktioniert gut. Vielen Dank – IBRA

Verwandte Themen