2011-08-08 6 views
0

J'ai un ComboBox lié à BindingList avec des chaînes. Cela fonctionne bien.ComboBox non contraignant dans datagrid

public BindingList<string> MyList 
{ 
    get 
    { 
     BindingList<string> list = new BindingList<string>(); 
     list.Add("one"); 
     list.Add("two"); 
     list.Add("three"); 

     return list; 
    } 
} 

XAML:

<ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Quand je même code mis dans le WPF 4 DataGrid, il ne fonctionne plus (mais le combo extérieur DataGrid est toujours en cours d'exécution ok):

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}"> 
         <ComboBox.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding}" /> 
          </DataTemplate> 
         </ComboBox.ItemTemplate> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Pourquoi? Merci

Répondre

1

Parce que dans le cas de la DataGridComboBox a des DataContext - l'élément de données de ligne de la grille, qui ne possède pas la propriété MyList.

Pour résoudre ce problème, vous pouvez utiliser RelativeSource lier à lier à la DataContext de la grille:

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.MyList}"> 
         <ComboBox.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding}" /> 
          </DataTemplate> 
         </ComboBox.ItemTemplate> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+1

Merci. Eh bien, après 4 heures de googling, vous avez répondu en 7 minutes. Merci –

+0

@ o..o - De rien. À l'avenir, pour détecter de telles erreurs, exécutez l'application sous le débogueur et regardez dans la fenêtre de sortie dans Visual Studio. Vous verrez des erreurs de liaison là-bas. –