none
在XAML中如何将DataGridComboBoxColumn列的ItemsSource属性绑定到DataContext? RRS feed

  • 问题

  • XAML如下:

        <Grid Name="grid">
            <DataGrid Name="dataGrid" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="部门名称" Binding="{Binding Path=DepName}" />
                    <DataGridComboBoxColumn x:Name="cmbCol" Header="负责人" ItemsSource="{Binding Path=Employees}" DisplayMemberPath="EmpName"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    

    在代码中将一个Department对象赋给了grid的DataContext属性,其中Department对象中的Employees属性是一个List<Employee>,部分代码如下:

      public partial class MainWindow : Window
        {

    public MainWindow() { InitializeComponent(); Department dep1 = new Department(); dep1.DepCode = "dep01"; dep1.DepName = "行政部"; dep1.Employees.Add(new Employee { EmpNo = "001", EmpName = "张三"}); dep1.Employees.Add(new Employee { EmpNo = "002", EmpName = "李四" }); dep1.Employees.Add(new Employee { EmpNo = "003", EmpName = "王五" }); grid.DataContext = dep1; dataGrid.ItemsSource = new Department[] { dep1 }; } } public class Employee { public string EmpNo { get; set;} public string EmpName { get; set; } } public class Department { public string DepCode { get; set; } public string DepName { get; set; } private List<Employee> employees = new List<Employee>(); public List<Employee> Employees { get { return employees; } } }

    为什么在cmbCol列的下拉列表框中没有任何内容呢?绑定代码应该怎么写?

    2014年6月3日 9:17

答案

  • 你好。

    DataGridComboBoxColumn对数据源有要求:静态资源、x: 静态代码实体或者ComboBoxItem 类型的内联集合。

    我们可以通过设置DataGridComboBoxColumn的Style的方式来完成:

    <DataGrid Name="dataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="部门名称" Binding="{Binding Path=DepName}" />
            <DataGridComboBoxColumn Header="负责人" DisplayMemberPath="EmpName">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=Employees}" />
                        <Setter Property="SelectedValue" Value="{Binding Path=EmpNo}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=Employees}" />
                        <Setter Property="SelectedValue" Value="{Binding Path=EmpNo}" />
                        <Setter Property="DisplayMemberPath" Value="EmpName"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

    这样就能在下拉框中显示和选择内容了。




    2014年6月3日 9:52

全部回复

  • 你好。

    DataGridComboBoxColumn对数据源有要求:静态资源、x: 静态代码实体或者ComboBoxItem 类型的内联集合。

    我们可以通过设置DataGridComboBoxColumn的Style的方式来完成:

    <DataGrid Name="dataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="部门名称" Binding="{Binding Path=DepName}" />
            <DataGridComboBoxColumn Header="负责人" DisplayMemberPath="EmpName">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=Employees}" />
                        <Setter Property="SelectedValue" Value="{Binding Path=EmpNo}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=Employees}" />
                        <Setter Property="SelectedValue" Value="{Binding Path=EmpNo}" />
                        <Setter Property="DisplayMemberPath" Value="EmpName"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

    这样就能在下拉框中显示和选择内容了。




    2014年6月3日 9:52
  • 多谢指点。

    经测试,在Style中设置ItemsSource时还要指定RelativeSource,即

     <Setter Property="ItemsSource" Value="{Binding Path=Employees,RelativeSource ={RelativeSource AncestorType={x:Type DataGrid}}}" />

    这样才能真正到grid的DataContext属性取值。


    2014年6月4日 6:03