![](/img/trans.png)
[英]WPF UserControls with different inner datagrid ItemSource attribute
[英]wpf DataGrid of UserControls
我试图有一个DataGrid在其行的每个单元格中显示一个用户控件。 这说明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行必须在每个Cell中显示此UserControl。 我已经搜索了很多技巧,但似乎DataGrid无法在单元格中托管UserControl。
我想拥有执行此操作的C#代码,请不要使用XAML代码,因为它都是动态的!
就像我在评论中提到的那样,您只能使用XAML动态地执行此操作。 在后面的代码中执行此操作, 您可能最终会写很多代码,而失去WPF的重要功能 。 最重要的是,如果您自己手动创建行,则是UI Virtualization
。
如果您不需要任何绑定支持,并且想要显示纯DataGrid并用UserControl填充所有单元格,则可以执行以下操作:
它将显示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>
UPDATE
如果要动态设置列(如我在评论中提到的那样),则必须将AutoGenerateColumns
设置为False
并手动添加Columns集合。 无需手动创建DataGridTemplateColumns
,您可以在DataGrid的资源部分下声明它,并在后面的代码中使用它。
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.