【问题标题】:How can I use different properties for the dropdown and the cell contents of a DataGridComboBoxColumn?如何为 DataGridComboBoxColumn 的下拉列表和单元格内容使用不同的属性?
【发布时间】:2014-03-04 22:16:30
【问题描述】:

我有以下课程:

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&lt;Zone&gt; 作为ItemsSourceDataGridComboBoxColumn

((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"}
};

设置DisplayMemberPath="Formatted"有两个作用:

  1. 单元格内容包含Formatted 属性的值
  2. 下拉菜单使用Formatted 生成下拉项目。

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

【问题讨论】:

标签: wpf datagridcomboboxcolumn


【解决方案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>

【讨论】:

  • 我更喜欢使用 DataGridComboBoxColumn,但我更喜欢这个答案,因为它很简单。
【解决方案2】:

如果DatagridTemplateColumn也可以,你可以这样做:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多