2010-10-23 6 views
0

J'ai un DataGrid avec des données dans mon application de bureau WPF 4. Lorsqu'un utilisateur clique deux fois sur une ligne, DataGrid passe en mode d'édition, où un utilisateur peut modifier les valeurs d'une cellule. Maintenant, je veux que sur l'utilisateur de la cellule spécifique peut seulement choisir des valeurs de la zone de liste déroulante, par exemple. sexe - homme/femme et ne pas taper autre chose.Afficher ComboBox sur l'édition de lignes Datagrid, WPF

Comment afficher une zone de liste déroulante en mode édition de DataGrid?

Merci.

Répondre

1

Un certain nombre de façons différentes en fait,

Reliure à un ENUM

public enum ChoiseEnum 
{ 
    Yes, 
    No, 
    Maybe 
} 

D'abord, vous allez besoin d'un ObjectDataProvider

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

<ObjectDataProvider MethodName="GetValues" 
        ObjectType="{x:Type sys:Enum}" 
        x:Key="ChoiseEnumDataProvider"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="local:ChoiseEnum" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

Ensuite, nous pouvons lier un DataGridComboBoxColumn à une propriété appelée Choise comme ceci

<DataGrid Name="c_dataGrid" 
      AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Choise" 
           SelectedItemBinding="{Binding Choise}" 
           ItemsSource="{Binding Source={StaticResource ChoiseEnumDataProvider}}"/> 
    </DataGrid.Columns> 
</DataGrid> 

Seules les valeurs de spectacle à partir d'une liste statique dans la zone de liste déroulante

MISE À JOUR
Ajout de plus de détails

namespace ComboBoxDataGrid 
{ 
    public class TestClass 
    { 
     static TestClass() 
     { 
      ChoiseData = new List<string>(); 
      ChoiseData.Add("Yes"); 
      ChoiseData.Add("No"); 
      ChoiseData.Add("Maybe"); 
     } 
     public static List<string> ChoiseData 
     { 
      get; 
      set; 
     } 

     public TestClass() 
     { 
      SelectedChoise = string.Empty; 
     } 
     public TestClass(string selectedChoise) 
     { 
      SelectedChoise = selectedChoise; 
     } 
     public string SelectedChoise 
     { 
      get; 
      set; 
     } 
    } 
} 

public partial class WinWorkers: Window 
{ 
    public WinWorkers() 
    { 
     InitializeComponent(); 
     TestClasses = new ObservableCollection<TestClass>(); 
     TestClasses.Add(new TestClass("Yes1")); 
     TestClasses.Add(new TestClass("No")); 
     TestClasses.Add(new TestClass("Maybe")); 
     c_dataGrid.ItemsSource = TestClasses; 
    } 

    public ObservableCollection<TestClass> TestClasses 
    { 
     get; 
     set; 
    } 
} 

<Window x:Class="ComboBoxDataGrid.WinWorkers" 
     xmlns:local="clr-namespace:ComboBoxDataGrid" 
     ...> 
    <Window.Resources> 
     <local:TestClass x:Key="TestClass" /> 
    </Window.Resources> 
    <Grid> 
     <DataGrid Name="c_dataGrid" 
        AutoGenerateColumns="False" 
        RowHeaderWidth="100"> 
      <DataGrid.Columns> 
       <DataGridComboBoxColumn Header="Choise_StaticList" 
             SelectedValueBinding="{Binding SelectedChoise}" 
             ItemsSource="{Binding Source={StaticResource TestClass}, Path=ChoiseData}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
+0

J'ai essayé votre dernière façon, mais en fait aucune liaison est effectuée, Je vois un combobox propre. Ma fenêtre s'appelle WinWorkers. J'ai créé une liste de valeurs dans WinWorkers.cs ajouté getter et setter, comme vous l'avez mentionné. Dans WinWorkers.xaml, j'ai mis DataGridComboBoxColumn et ItemSource paramétré de différentes manières, mais cela ne fonctionne pas. par exemple. ItemsSource = "{Binding Path = ListName}" ne fonctionne pas. Comment puis-je me connecter à la liste «genderList», créée dans la même classe? Merci. –

+0

Mise à jour du deuxième exemple avec plus de détails –

Questions connexes