【问题标题】:Can Datagrid column contain diffterent type of control in different rowDatagrid列是否可以在不同的行中包含不同类型的控件
【发布时间】:2013-02-01 03:34:59
【问题描述】:

在 Wpf 中,我可以创建一个数据网格,它的不同行在同一列中包含不同类型的控件吗?

对于最简单的情况:数据网格有 5 列,2 行,不关心 4 列,在第 5 列:

  • 第一行:这是一个文本框
  • 第二行:它是一个组合框。

谢谢!

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

    您可以使用 DataGridTemplateColumn 结合一些触发器来实现此功能。

    这是一个将 DataGrid 绑定到(字符串)控件类型列表的演示应用程序。第一列只显示控件类型字符串,第二列作用于相同的信息呈现对应的Control。您也许可以使 xaml 更简洁一些,但这就是它的要点:

    XAML:

    <Window x:Class="DataGridWithMultipleTypesPerColumn.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding ControlTypes}"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
            <DataGridTextColumn Header="Control Type" Binding="{Binding}"/>
                <DataGridTemplateColumn Header="Actual Control">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl>
                                <ContentControl.Style>
                                    <Style TargetType="ContentControl">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding}" Value="TextBox">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <TextBox Text="Default Text"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding}" Value="CheckBox">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <CheckBox Content="Check Box"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding}" Value="Button">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <Button Content="Button"/>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </ContentControl.Style>
                            </ContentControl>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    代码隐藏和视图模型:

    namespace DataGridWithMultipleTypesPerColumn
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new ViewModel();
            }
        }
    
        public class ViewModel
        {
            public ObservableCollection<string> ControlTypes
            {
                get;
                private set;
            }
            public ViewModel()
            {
                ControlTypes = new ObservableCollection<string>() { "Button", "TextBox", "CheckBox" };
            }
        }
    }
    

    【讨论】:

    • 谢谢,我现在可以了。我找到了一个很容易理解的指令:code.msdn.microsoft.com/mag201104DataPoints。我还没有尝试你的指示,但它似乎有道理。
    • 如何将数据绑定到我们动态选择的控件?
    • 在这种情况下如何进行绑定?例如,您有这样的:,但是我们如何将 Text 属性绑定到某个东西?问题是这个 TextBox 没有 DataContext 也看不到父级的 datacontext。
    【解决方案2】:

    是的,你可以。您需要为您的专栏创建一个模板。

    看到这个:WPF DataGrid different edit controls within a single column

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2021-04-15
      • 2018-09-13
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多