C# UserControls的wpf数据网格

C# UserControls的wpf数据网格,c#,wpf,datagrid,user-controls,advanceddatagrid,C#,Wpf,Datagrid,User Controls,Advanceddatagrid,我正在尝试创建一个DataGrid,它在其行的每个单元格中显示用户控件。强调数据网格必须是动态的,因为每种情况下的列数都是动态的 在我的xaml代码(xaml)中,我将此作为DataGrid的声明: <Grid Grid.Column="1" Margin="0,10,0,0"> <DataGrid AutoGenerateColumns="False" x:Name="planningTable" FrozenColumnCount="1"/> </

我正在尝试创建一个DataGrid,它在其行的每个单元格中显示用户控件。强调数据网格必须是动态的,因为每种情况下的列数都是动态的

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

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

我的用户控件如下所示(UserControl已经完成,并且工作正常):

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


我想用C代码来做这个,请不要用XAML代码,因为它是动态的

正如我在评论中提到的,您可以仅使用XAML动态地执行此操作。 在代码隐藏中这样做,最终可能会编写大量代码,并忽略WPF的重要特性。最重要的是
UI虚拟化
如果您自己手动创建行


如果您不需要任何绑定支持,并且希望显示所有单元格都填充有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>
代码隐藏

公共部分类主窗口:窗口
{
私有void CreateDataGridColumns()
{
for(int i=0;i<10;i++)//更改此处的列数。
{
DataGridTemplateColumn templateColumn=
(DataGridTemplateColumn)dataGrid.Resources[“TemplateColumn”];
templateColumn.Header=String.Format(“Test{0}”,i+1);
dataGrid.Columns.Add(templateColumn);
}
}
公共主窗口()
{
初始化组件();
CreateDataGridColumns();
}
}

您可以用XAML的方式来实现它(太整洁和动态也行)。但您需要添加更多详细信息,以确定需要多少列和行?ItemsSource是否绑定到某个集合?是的,确实可以通过数据绑定使用XAML动态地实现这一点。但是我想让c代码来实现这一点,因为我没有使用数据绑定!非常感谢@Rohit,它工作得很好!!!我太棒了,你能告诉我如何使列计数为动态的吗?例如,有时是6列,另一个时间是X列。你能告诉我如何使DataGrid列计数为动态的吗??另一种方法是在dataGrid加载时手动添加代码隐藏中的列。但正如我所说,如果这样做,您将失去UI虚拟化,即,如果您添加例如10列,您将看到在UI上呈现的延迟。但如果您在XAML中手动添加10列,它将立即显示。我已经用另一种方法更新了答案。看看这对你是否有效。(显然绑定是更好的方式,但如果你不想绑定任何东西,这也会起作用)。非常感谢你,兄弟!!!你是英国人!!!!非常感谢你!!
<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();
    }
}