C# 如何制作动态C控件

C# 如何制作动态C控件,c#,forms,dynamic,data-binding,C#,Forms,Dynamic,Data Binding,我正在做一个项目,需要一些绑定方面的帮助 我有一个产品清单,可以属于配送中心。我想创建一个动态表单,也就是说,它可以根据信息的可用性自行决定应该显示什么内容 基本上,发行版目前有3种产品可以报告,但这个数字是可变的。它现在应该显示3个条目,但如果有更多或更少的条目,它应该能够处理它 例如,我想将DistributionCenter的Name属性绑定到一种类型的标题标签,不同的产品名称以及每个名称的数量应显示为动态部分的两个标签 我希望我有道理。这是模型代码,GUI还没有实现,因为我确实需要这方面

我正在做一个项目,需要一些绑定方面的帮助

我有一个产品清单,可以属于配送中心。我想创建一个动态表单,也就是说,它可以根据信息的可用性自行决定应该显示什么内容

基本上,发行版目前有3种产品可以报告,但这个数字是可变的。它现在应该显示3个条目,但如果有更多或更少的条目,它应该能够处理它

例如,我想将DistributionCenter的Name属性绑定到一种类型的标题标签,不同的产品名称以及每个名称的数量应显示为动态部分的两个标签

我希望我有道理。这是模型代码,GUI还没有实现,因为我确实需要这方面的帮助

namespace Stock
{
    public partial class MainWindow : Window
    {
        public class Product
        {
            // accessors
            public string Code { get; set; }
            public string Name { get; set; }
            public int Quantity { get; set; }
            private int Threshold { get; set; }

            // constructor
            public Product(string code, string name, int quantity, int threshold)
            {
                this.Code = code;
                this.Name = name;
                this.Quantity = quantity;
                this.Threshold = threshold;
            }
        }
        public class DistributionCentre
        {
            // accessors
            public string Name { get; set; }
            public List<Product> p = new List<Product>();

            // constructor
            public DistributionCentre(string name, Product product)
            {
                this.p.Add(product);
            }
        }

        public class StockEngine
        {
            public StockEngine()
            {
                // register a few products
                Product p1 = new Product("1001", "Product1", 10, 5);
                Product p2 = new Product("1002", "Product2", 6, 5);
                Product p3 = new Product("1003", "Product3", 8, 5);

                // assign these products to a DC
                DistributionCentre ClinicA = new DistributionCentre("DC1", p1);
            }
        }

        public MainWindow()
        {            
            StockEngine control = new StockEngine();
            InitializeComponent();
        }
    }
编辑: 我另外创建了以下控件,并希望将这些控件绑定到C类的相关成员。在此方面的任何帮助都将不胜感激

<UserControl x:Class="Stock.ReportingCard"
         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" 
         d:DesignHeight="37" d:DesignWidth="300">
<Grid Height="35">
    <Label Content="Product" Height="25" HorizontalAlignment="Left" Name="Product" VerticalAlignment="Top" Width="67" Margin="5,5,0,0" />
    <Label Content="Quantity" Height="30" HorizontalAlignment="Left" Margin="78,5,0,0" Name="Quantity" VerticalAlignment="Top" Width="59" />
    <Button Content="Plus" Height="24" HorizontalAlignment="Left" Margin="171,6,0,0" Name="PlusButton" VerticalAlignment="Top" Width="44" />
    <Button Content="Minus" Height="24" HorizontalAlignment="Left" Margin="233,6,0,0" Name="MinusButton" VerticalAlignment="Top" Width="44" />
</Grid>

Hello@Harriet说实话,我在提供的代码中看到了很多问题,但我不打算讨论其中的大多数问题,因为这也有点主观,我也觉得你的问题太宽泛,有点误导,但我会讨论让我感兴趣的部分,并给你一些如何修复该部分的指针和示例

namespace Stock
{
    public partial class MainWindow : Window
    {
        public class Product
        {
            // accessors
            public string Code { get; set; }
            public string Name { get; set; }
            public int Quantity { get; set; }
            private int Threshold { get; set; }

            // constructor
            public Product(string code, string name, int quantity, int threshold)
            {
                this.Code = code;
                this.Name = name;
                this.Quantity = quantity;
                this.Threshold = threshold;
            }
        }
        public class DistributionCentre
        {
            // accessors
            public string Name { get; set; }
            public List<Product> p = new List<Product>();

            // constructor
            public DistributionCentre(string name, Product product)
            {
                this.p.Add(product);
            }
        }

        public class StockEngine
        {
            public StockEngine()
            {
                // register a few products
                Product p1 = new Product("1001", "Product1", 10, 5);
                Product p2 = new Product("1002", "Product2", 6, 5);
                Product p3 = new Product("1003", "Product3", 8, 5);

                // assign these products to a DC
                DistributionCentre ClinicA = new DistributionCentre("DC1", p1);
            }
        }

        public MainWindow()
        {            
            StockEngine control = new StockEngine();
            InitializeComponent();
        }
    }
为了简单起见,我不会使用您提供的整个结构。请注意,要使绑定按预期工作,例如更改视图模型中的某些内容->UI更新,反之亦然,您需要实现INotifyPropertyChanged或使用一些MVVM框架,如MVVM Light、Prism等。。。这就为你提供了更多的东西

因此,我们要解决的问题是,对于不同类型的产品,有不同的动态控制,不确定您是否考虑到了这一点,但这是我对动态控制的理解

我们将使用我喜欢的两种方法中的一种来解决MSDN中的此类问题,MSDN是经过稍微修改的示例版本:

我用过的另一个,我喜欢这里:

这是一个XAML,演示了3种不同类型的动态控件和一个包含我们在代码隐藏中定义的所有产品的ListView

public MainWindow()
{
    InitializeComponent();
    //StockEngine control = new StockEngine();

    var products = new List<Product>();

    Product p1 = new Product("1001", "Product1", 10, 5);
    Product p2 = new Product("1002", "Product2", 6, 5);
    Product p3 = new Product("1003", "Product3", 8, 5);
    Product p4 = new Product("999", "Some Prod", 8, 5);
    Product p5 = new Product("1002", "Product4", 10, 10);

    products.Add(p1);
    products.Add(p2);
    products.Add(p3);
    products.Add(p4);
    products.Add(p5);

    ListView.ItemsSource = products;
}

我们将在代码隐藏中使用一个简单的产品列表

public MainWindow()
{
    InitializeComponent();
    //StockEngine control = new StockEngine();

    var products = new List<Product>();

    Product p1 = new Product("1001", "Product1", 10, 5);
    Product p2 = new Product("1002", "Product2", 6, 5);
    Product p3 = new Product("1003", "Product3", 8, 5);
    Product p4 = new Product("999", "Some Prod", 8, 5);
    Product p5 = new Product("1002", "Product4", 10, 10);

    products.Add(p1);
    products.Add(p2);
    products.Add(p3);
    products.Add(p4);
    products.Add(p5);

    ListView.ItemsSource = products;
}
因此,所有这些代码所做的是:拥有一个带有源代码的ListView—您的产品,模板选择器负责根据其代码为集合中的每个产品返回正确的模板。不同的模板使用不同的控件结构或样式进行说明。我使用了您的示例控件,并向产品的属性添加了一些简单的绑定


如果有人觉得这个答案离题且没有帮助,请告诉我,我会把它写下来。

听起来相当直截了当。控件可以动态创建并添加到表单中,而不受任何实际限制。也许构建一个或多个用户对象是个好主意,也许每个产品类型一个。查看formDesigner.cs文件以了解系统是如何执行此操作的:使用new创建控件并将其添加到form.controls集合中首先在desgner中构建表单,然后对动态表单进行建模也会有所帮助。有人愿意在这方面提供帮助吗?更新显示了xml,所以这毕竟与WinForms无关???-你的目标是什么:Winforms?WPF?ASP。。。??始终相应地标记您的问题!我想你把标签弄乱了,应该是wpf而不是听起来像Windows窗体的窗体