c# WPF:在DataGridRow中放置UserControl

本文关键字:UserControl DataGridRow WPF | 更新日期: 2023-09-27 18:02:44

我正在用c#创建一个WPF应用程序。在我的窗口有一个数据网格。在网格中有2列。第一列只包含字符串。在第二列中,我想显示我创建的用户控件。

UserControl(称为:ProductControl)由3个按钮和3个文本框组成。

这是控件的XAML代码:
<UserControl x:Class="CARDS.ProductControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" Height="95" Width="273">
<Grid Margin="-23,0,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="10*"/>
        <RowDefinition Height="24*"/>
        <RowDefinition Height="29*"/>
        <RowDefinition Height="32*"/>
    </Grid.RowDefinitions>
    <Button x:Name="btnSP_P" Content="SP/P" HorizontalAlignment="Left" Margin="215,3,0,0" VerticalAlignment="Top" Width="75" Grid.Row="2"/>
    <Button x:Name="btnNM_M" Content="NM/M" HorizontalAlignment="Left" Margin="215,0,0,0" VerticalAlignment="Top" Width="75" Grid.Row="1"/>
    <Button x:Name="btnHP" Content="HP" HorizontalAlignment="Left" Margin="215,4,0,0" VerticalAlignment="Top" Width="75" Grid.Row="3"/>
    <TextBox x:Name="txtNM_M" HorizontalAlignment="Left" Height="23" Margin="27,0,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="183" Grid.Row="1"/>
    <TextBox x:Name="txtSP_P" HorizontalAlignment="Left" Height="23" Margin="27,4,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="183" Grid.Row="2"/>
    <TextBox x:Name="txtHP" HorizontalAlignment="Left" Height="23" Margin="27,3,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="183" Grid.Row="3"/>
</Grid>

这是控件的c#代码:
public partial class ProductControl : UserControl
    {
        public String NM_M { get; protected set; }
        public String SP_P { get; protected set; }
        public String HP { get; protected set; }
        public ProductControl()
        {
            InitializeComponent();
        }
        public void Set(String nm_m, String sp_p, String hp)
        {
            this.NM_M = nm_m;
            this.SP_P = sp_p;
            this.HP = hp;
            txtHP.Text = hp;
            txtNM_M.Text = nm_m;
            txtSP_P.Text = sp_p;
        }
    }

我有2个类,其中包含需要在数据网格中显示的数据:

class DataItems {
    public List<DataItemCard> items = new List<DataItemCard>();
}
class DataItemCard {
    public String Reference { get; set; }
    public ProductControl Products { get; set; }
}

DataItems的实例用作DataGrid的ItemsSource。字符串正确显示,但在第二列中只有类型:'CARDS.ProductControl'。

DataGrid在XAML文件中声明为:
<DataGrid x:Name="gridDisplayCards" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top" RenderTransformOrigin="3.046,4.843" Height="273" Width="284">

我的问题:如何在单元格中显示控件?

感谢大家的帮助和外部链接。现在可以用了,问题出在装配上。我用的是:xmlns:controls="clr-namespace:OUTPOST_BUY_IN_SINGLE_CARDS;assembly=OUTPOST_BUY_IN_SINGLE_CARDS"但它只需要是:

xmlns:controls="clr-namespace:OUTPOST_BUY_IN_SINGLE_CARDS"

c# WPF:在DataGridRow中放置UserControl

当你想在DataGrid中显示自定义控件时,你需要使用DataGridTemplateColumn

https://msdn.microsoft.com/en-us/library/system.windows.controls.datagridtemplatecolumn%28v=vs.110%29.aspx

你需要添加一个xmlns指令,如xmlns:controls="clr-namespace:MyControls;assembly=MyControls"到你的窗口,然后引用这样的控件:

       <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <MyControls:ProductControl /><!--You will need to add your binding expressions to the ProductControl element-->
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

这个存在的问题应该可以帮助你解决任何绑定问题。

如何在WPF中使用datagridtemplatecoluml绑定用户控件

您可以使用TemplateColum。对于该列类型,可以用XAML定义内容。因此,您可以将控件放置在列模板中:

<DataGrid.Columns>
   <DataGridTemplateColumn Header="TemplateColumn">
       <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
               <YourControl></YourControl>
            </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
   </DataGridTemplateColumn>
</DataGrid.Columns>

据我所知有两种方法。

  1. 解决方案

    添加一个引用到你的xaml。如果xaml找不到您的控件,通常是因为您忘记添加程序集。如果从其他项目引用控件,则程序集非常重要。

     xmlns:controls="clr-namespace:MyControls;assembly=MyControls"
    

    然后你可以使用

    这样的控件
    <controls:ControlClass....>
    

    有时候,你需要重新构建解决方案来使智能感知工作(顺便说一下,智能感知是愚蠢的,所以不要对智能感知期望太高/_/)

  2. 使用内容控制添加用户控制。如果您希望在后台代码中动态添加用户控件,则通常使用此解决方案。

    首先在.xaml

    中添加这一行
    <DataTemplate>
       <ContentControl x:Name="ContentControl1"></ContentControl>
    </DataTemplate>
    
    然后在后面的代码中添加
     ContentControl1.Content = new YourControlHere();