2009-03-30 7 views
2

J'ai une colonne de modèle DataGrid avec ComboBox. Lorsque je sélectionne une valeur et que j'appuie sur Entrée, les données liées ne sont pas mises à jour (je vois une cellule vide).Problèmes avec DataGridTemplateColumn avec 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; 
     } 
    } 
} 

Si je change ComboBox à TextBox, il fonctionne très bien

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

Qu'est-ce qui ne va pas?

Répondre

1

Je ne sais pas si c'est une solution réalisable à votre problème, mais si vous changez la liaison ItemsSource de la Combo-Box à une StaticResource, la liaison fonctionne.

... 

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

... 

Je suis assez sûr que ce qui se passe est que lorsque le ComboBox est déchargé (lorsque le EditTemplate est déchargé en raison de la présentation du nouveau record), le DynamicResource tente de rechercher à nouveau la ressource, et échoue (parce que le ComboBox n'est plus dans l'arbre visuel, il ne trouvera pas la ressource définie ci-dessus dans l'arbre visuel). Cela définira la ItemsSource à null, et définira également le SelectedItem à null, définissant ainsi LastName à null.

Avec une ressource statique, la collection n'est recherchée qu'une seule fois, avant que la zone de liste déroulante soit affichée, elle n'est donc pas réinitialisée sur null.

+0

Votre solution fonctionne et l'explication est claire. Il me semble que j'ai besoin d'un autre moyen pour mettre à jour ItemsSource ... – alex2k8

0

Une autre alternative (suivant la logique de la réponse 'Abe Heidebrecht') est de déplacer 'knownLastNames' dans Application.Resources. Voir le point # 3.

Dynamic resource lookup behavior

  1. Les contrôles de processus de recherche de la clé demandée dans le dictionnaire ressources défini par l'élément qui définit la propriété.

  2. Le processus de consultation traverse alors l'arbre logique vers le haut, à l'élément parent et de son dictionnaire ressource . Cela continue jusqu'à ce que l'élément racine soit atteint.

  3. Ensuite, les ressources de l'application sont vérifiées. Les ressources d'application sont ces ressources dans le dictionnaire de ressource défini par l'objet Application pour votre application WPF . Le dictionnaire de ressources de thème est vérifié pour le thème actuellement actif. Si le thème change à runtime, la valeur est réévaluée.

  4. Les ressources du système sont vérifiées.