如何为DataGridComboBoxColumn的下拉列表和单元格内容使用不同的属性?

时间:2014-03-04 22:16:31

标签: wpf datagridcomboboxcolumn

我有以下课程:

public class Zone {
    public int ID {get;set;}
    public string Name {get;set;}
    public string Formatted {get;set;}
}

使用以下DataGridComboBoxColumn

<DataGrid Name="dg" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridComboBoxColumn SelectedValueBinding="{Binding ZoneID}" DisplayMemberPath="Formatted" SelectedValuePath="ZoneID" />
  </DataGrid.Columns>
</DataGrid>

我正在使用List<Zone>作为ItemsSource的{​​{1}}:

DataGridComboBoxColumn

设置((DataGridComboBoxColumn)dg.Columns[0]).ItemsSource = new List<Zone> { new Zone {ID=0,Name="Zone0",Formatted="Zone0 - Formatted"}, new Zone {ID=1,Name="Zone1",Formatted="Zone1 - Formatted"}, new Zone {ID=2,Name="Zone2",Formatted="Zone2 - Formatted"}, new Zone {ID=3,Name="Zone3",Formatted="Zone3 - Formatted"}, new Zone {ID=4,Name="Zone4",Formatted="Zone4 - Formatted"} }; 有两个影响:

  1. 单元格内容包含DisplayMemberPath="Formatted"属性
  2. 的值
  3. 下拉菜单使用Formatted生成下拉项。
  4. DisplayMemberPath="Formatted DisplayMemberPath="Name"

    如何让单元格内容使用Formatted属性,而下拉列表使用Name属性?

2 个答案:

答案 0 :(得分:1)

我找到了另一种解决方案,但没有使用DataTemplateSelector覆盖整个模板:

public class ComboBoxTemplateSelector : DataTemplateSelector
{
  public DataTemplate BoxTemplate { get; set; }
  public DataTemplate ListTemplate { get; set; }

  public override DataTemplate SelectTemplate(object item, DependencyObject container)
  {
    var test = container;

    while (test != null)
    {
      if (test is ComboBox)
      {
        return BoxTemplate;
      }

      if (test is ComboBoxItem)
      {
        return ListTemplate;
      }

      test = VisualTreeHelper.GetParent(test);
    }

    return null;
  }
}

XAML:

<DataGrid AutoGenerateColumns="False">
  <DataGrid.Resources>
    <DataTemplate x:Key="Box">
      <TextBlock Text="{Binding Name}" />
    </DataTemplate>

    <DataTemplate x:Key="List">
      <TextBlock Text="{Binding Formatted}" />
    </DataTemplate>

    <Selector:ComboBoxTemplateSelector x:Key="Selector" 
          BoxTemplate="{StaticResource Box}" ListTemplate="{StaticResource List}" />

    <DataTemplate x:Key="CmbTemplate">
      <ComboBox SelectedItem="{Binding Zone}" 
          ItemsSource="{Binding Values, RelativeSource={RelativeSource AncestorType=Window}}" 
          ItemTemplateSelector="{StaticResource Selector}" />
    </DataTemplate>
  </DataGrid.Resources>

  <DataGrid.Columns>
    <DataGridTemplateColumn CellTemplate="{StaticResource CmbTemplate}">
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:0)

如果DatagridTemplateColumn也可以,您可以执行以下操作: