wpf UserControls的DataGrid

时间:2014-05-31 08:59:33

标签: c# wpf datagrid user-controls advanceddatagrid

我正在尝试使用DataGrid,在其行的每个单元格中显示用户控件。高亮显示DataGrid必须是动态的,因为列数对于每种使用情况都是动态的。

在我的xaml代码(XAML)中,我将此作为DataGrid的声明:

<Grid Grid.Column="1" Margin="0,10,0,0">
      <DataGrid AutoGenerateColumns="False" x:Name="planningTable" FrozenColumnCount="1"/> 
</Grid>

我的用户控件看起来像这样(UserControl已经完成并且它完美运行): enter image description here

作为DataGrid的结果,我希望在DataGrid的每个Cell中都有这个UserControl 这意味着DataGrid Rows必须在每个Cell中显示此UserControl。 我已经搜索了很多这个技巧,但似乎DataGrid无法在单元格中托管UserControl。

我想拥有执行此操作的C#代码,请不要使用XAML代码,因为它完全是动态的!

1 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,您只能使用XAML动态执行此操作。 在后面的代码中执行此操作,您最终可能会编写大量代码并且不再使用WPF的重要功能。最重要的是 UI Virtualization ,如果您自己手动创建行。


如果您不想要任何绑定支持并希望显示包含用UserControl填充的所有单元格的简单dataGrid,您可以这样做:

它将显示2列和100行填充您的自定义用户控件:

<Grid>
    <Grid.Resources>
        <ObjectDataProvider x:Key="EnumerableRange"
                 xmlns:sys="clr-namespace:System;assembly=mscorlib"
                 xmlns:linq="clr-namespace:System.Linq;assembly=System.Core"
                 ObjectType="{x:Type linq:Enumerable}" MethodName="Range">
            <ObjectDataProvider.MethodParameters>
                <sys:Int32>1</sys:Int32>
                <sys:Int32>100</sys:Int32>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Grid.Resources>
    <DataGrid AutoGenerateColumns="False" IsReadOnly="True"
            CanUserAddRows="False"
            CanUserDeleteRows="False"
            ItemsSource="{Binding Source={StaticResource EnumerableRange}}">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Test1">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <local:SampleUserControl/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Test2">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <local:SampleUserControl/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

<强>更新

如果您想动态设置列,就像我在评论中提到的那样,您必须将 AutoGenerateColumns 设置为 False 并手动添加列集合。您可以在DataGrid的资源部分下声明它,而不是手动创建 DataGridTemplateColumns ,并在后面的代码中使用它。

XAML

<Grid>
    <Grid.Resources>
        <ObjectDataProvider x:Key="EnumerableRange"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:linq="clr-namespace:System.Linq;assembly=System.Core"
            ObjectType="{x:Type linq:Enumerable}" MethodName="Range">
            <ObjectDataProvider.MethodParameters>
                <sys:Int32>1</sys:Int32>
                <sys:Int32>100</sys:Int32>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Grid.Resources>
    <DataGrid AutoGenerateColumns="False"
                x:Name="dataGrid"
                IsReadOnly="True"
                CanUserAddRows="False"
                CanUserDeleteRows="False"
                ItemsSource="{Binding Source={StaticResource EnumerableRange}}">
        <DataGrid.Resources>
            <DataGridTemplateColumn x:Key="TemplateColumn" x:Shared="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <local:SampleUserControl/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Resources>
    </DataGrid>
</Grid>

背后的代码

public partial class MainWindow : Window
{
    private void CreateDataGridColumns()
    {
        for (int i = 0; i < 10; i++) // Change number of columns here.
        {
            DataGridTemplateColumn templateColumn = 
                  (DataGridTemplateColumn)dataGrid.Resources["TemplateColumn"];
            templateColumn.Header = String.Format("Test {0}", i + 1);
            dataGrid.Columns.Add(templateColumn);
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        CreateDataGridColumns();
    }
}