2009-03-30 31 views
2

Ich habe eine DataGrid-Vorlage Spalte mit ComboBox. Wenn ich einen Wert auswähle und die Eingabetaste drücke, werden die gebundenen Daten nicht aktualisiert (ich sehe leere Zelle).Probleme mit DataGridTemplateColumn mit ComboBox

XAML:

<Window x:Class="WpfGrid2.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit" 
    > 

    <Window.Resources> 
     <x:Array x:Key="people" Type="sys:Object" /> 

     <x:Array x:Key="knownLastNames" Type="sys:String"> 
      <sys:String>Smith</sys:String> 
      <sys:String>Johnson</sys:String> 
      <sys:String>Williams</sys:String> 
     </x:Array> 
    </Window.Resources> 

    <StackPanel> 
     <dg:DataGrid x:Name="_grid" ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False"> 
      <dg:DataGrid.Columns> 

       <dg:DataGridTemplateColumn Header="LastName" MinWidth="100"> 
        <dg:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{DynamicResource knownLastNames}" SelectedItem="{Binding LastName}"></ComboBox> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellEditingTemplate> 
        <dg:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding LastName}" /> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellTemplate> 
       </dg:DataGridTemplateColumn> 

      </dg:DataGrid.Columns> 
     </dg:DataGrid> 

     <Button>test</Button> 
    </StackPanel> 
</Window> 

-Code-Behind:

namespace WpfGrid2 
{ 
    public partial class Window2 : Window 
    { 
     public Window2() 
     { 
      InitializeComponent(); 

      List<Person> people = new List<Person>(); 
      this.Resources["people"] = people; 
     } 
    } 
} 

Wenn ich ComboBox TextBox zu ändern, es funktioniert gut

<TextBox Text="{Binding LastName}" /> 

Was ist falsch?

Antwort

1

Ich weiß nicht, ob dies eine machbare Lösung für Ihr Problem ist, aber wenn Sie die ItemsSource-Bindung der Combo-Box zu einer StaticResource ändern, funktioniert die Bindung.

... 

<ComboBox ItemsSource="{StaticResource knownLastNames}" ... /> 

... 

Ich bin ziemlich sicher, dass das, was passiert ist, wenn die ComboBox entladen wird (wenn die EditTemplate aufgrund der Einreichung des neuen Datensatzes entladen wird), die Dynamic die Ressource wieder nachzuschlagen versucht und versagt (weil die ComboBox befindet sich nicht mehr im visuellen Baum, es wird die darüber definierte Ressource im visuellen Baum nicht finden). Dadurch wird ItemsSource auf null gesetzt und das SelectedItem-Objekt wird auf null gesetzt, wodurch LastName auf null gesetzt wird.

Mit einer StaticResource wird die Auflistung nur einmal durchsucht, bevor die ComboBox angezeigt wird. Daher wird sie nicht auf null zurückgesetzt.

+0

Ihre Lösung funktioniert und Erklärung macht Sinn. Scheint, ich brauche eine andere Möglichkeit, ItemsSource aktualisierbar zu machen ... – alex2k8

0

Eine weitere Alternative (nach der Logik der Antwort 'Abe Heidebrecht') ist das Verschieben von 'knownLastNames' in Application.Resources. Siehe Punkt 3.

Dynamic resource lookup behavior

  1. Die Lookup-Prozess überprüft die angeforderten Schlüssel im Wörterbuch Ressource durch das Element definiert , das die Eigenschaft festlegt.

  2. Der Nachschlagevorgang durchläuft dann den logischen Baum nach oben zu dem Mutterelement und dessen Ressource Wörterbuch. Dies wird fortgesetzt, bis das Wurzelelement erreicht ist.

  3. Als nächstes werden die Anwendungsressourcen überprüft. Anwendungsressourcen sind diese Ressourcen innerhalb der Ressource Wörterbuch, das durch das Anwendungsobjekt für Ihre WPF Anwendung definiert ist.

  4. Thema Ressource Wörterbuch ist überprüft, für die derzeit aktive Thema. Wenn sich das Design bei Laufzeit ändert, wird der Wert erneut ausgewertet.

  5. Systemressourcen werden überprüft.