1. 程式人生 > 實用技巧 >WPF Datagrid Contains Combox and edit it DataGridTemplateColumn

WPF Datagrid Contains Combox and edit it DataGridTemplateColumn

XAML,Here I used DataGridTemplateColumn instead of DataGridComboxColumn,When I want to edit the combox,its itemssource must binded as Static data source, modified by static key word.

 <DataGrid SelectionMode="Single" IsReadOnly="False" AutoGenerateColumns="False" ItemsSource="{Binding UsersList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
"> <DataGrid.Columns> <DataGridTemplateColumn Header="Nation" > <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <ComboBox ItemsSource="{Binding Source={x:Static local:MainWindow.NationsList}}
" SelectedIndex="0"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Nation,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridCheckBoxColumn Header="CanEnglish" IsThreeState="False" Binding="{Binding CanEnglish,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </DataGrid.Columns> </DataGrid>

.cs

public partial class MainWindow : Window
    {
        public static  List<string> NationsList { get; set; }
        public List<User> UsersList { get; set; }
        static MainWindow()
        {
            NationsList = new List<string> { "USA", "UK", "JAPAN" };
        }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            InitDataSource();
            var temp = NationsList;
        }

        private void InitDataSource()
        {           
            UsersList = new List<User>();
            UsersList.Add(new User()
            {
                Nation = NationsList[0],
                Name = "Fred1",
                CanEnglish = true
            });

            UsersList.Add(new User()
            {
                Nation = NationsList[1],
                Name = "Fred2",
                CanEnglish = true
            });

            UsersList.Add(new User()
            {
                Nation = NationsList[2],
                Name = "Fred3",
                CanEnglish = true
            });

        }
    }

    public class User
    {
        public string Nation { get; set; }
        public string Name { get; set; }
        public bool CanEnglish { get; set; }
    }

<DataGrid SelectionMode="Single" IsReadOnly="False" AutoGenerateColumns="False" ItemsSource="{Binding UsersList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <DataGrid.Columns> <DataGridTemplateColumn Header="Nation" > <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <ComboBox ItemsSource="{Binding Source={x:Static local:MainWindow.NationsList}}" SelectedIndex="0"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Nation,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridCheckBoxColumn Header="CanEnglish" IsThreeState="False" Binding="{Binding CanEnglish,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </DataGrid.Columns> </DataGrid>