【问题标题】:WPF DataGrid with different UserControl in each Cell每个单元格中具有不同 UserControl 的 WPF DataGrid
【发布时间】:2013-08-09 20:09:37
【问题描述】:

我有一个如下所示的数据模型:

public class Model
{
    public string DisplayAs {get;set;} // TextBox, CheckBox, ComboBox
    public string Value {get;set;}
    public string DisplayName {get;set;} // Row1, Row2, ...
}

现在我想在 Datagrid 中显示这些模型,如下所示:

我怎样才能做到这一点?请提供一些示例代码。 我用不同类型的 DataTemplateSelectors 尝试了一整天,但我无法让它工作

【问题讨论】:

标签: c# wpf datagrid datatemplateselector celltemplate


【解决方案1】:

您的选择器会根据它们的DisplayAs 值为第二列中的单元格选择一个模板。您必须将模板添加到您的DataGrid.Resources。然后在第二列中,分配CellTemplateSelector

public class DynamicDataTemplateSelector: DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is Task)
        {
            Model model = item as Model;

            return element.FindResource(model.DisplayAs + "Template");
        }

        return null;
    }
}

<DataGrid>
    <DataGrid.Resources>
        <DataTemplate x:Key="TextBoxTemplate">
            <TextBox Text="{Binding Value}"/>
        </DataTemplate>
        <DataTemplate x:Key="CheckBoxTemplate">
            <CheckBox IsChecked="{Binding Value}"/>
        </DataTemplate>
        <DataTemplate x:Key="ComboBoxTemplate">
            <ComboBox SelectedItem="{Binding Value}"/>
        </DataTemplate>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="RowName">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{DisplayName}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Data" 
             CellTemplateSelector="{StaticResource DynamicDataTemplateSelector}"/>
    <DataGrid.Columns>
<DataGrid/>

【讨论】:

  • 谢谢李!那就是我正在寻找的东西。经过一夜的睡眠,似乎没有那么复杂。因为我希望我的模型代表几个这样的“控制列”,所以我在 DatagridTemplateColumn 中使用了 ContentPresenter,我为其应用了 TemplateSelector。所以我可以将某个属性绑定到 ContentPresenter
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 2013-06-24
  • 2015-04-05
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多