绑定带有标签代码的列表元素

时间:2019-03-27 10:52:26

标签: c# wpf binding

我尝试将结构列表与动态创建的标签绑定。

结构代码:

public struct PrinterToGridBinds
        {
            public string extPrinterName { get; set; }
            public string extIcecreamType { get; set; }
            public string extBatchNumber { get; set; }
            public string extBeginingDate { get; set; }
            public string extPrinterState { get; set; }
            public string extBatchCounter { get; set; }
            public string extDIOCounter { get; set; }

            public PrinterToGridBinds(string extPrinterName, string extIcecreamType, string extBatchNumber, string extBeginingDate,
                string extPrinterState, string extBatchCounter, string extDIOCounter)
            {
                this.extPrinterName =  extPrinterName;
                this.extIcecreamType = extIcecreamType;
                this.extBatchNumber = extBatchNumber;
                this.extBeginingDate = extBeginingDate;
                this.extPrinterState = extPrinterState;
                this.extBatchCounter = extBatchCounter;
                this.extDIOCounter = extDIOCounter;
            }
        }

        public List<PrinterToGridBinds> lst_PrinterToGridBindings = new List<PrinterToGridBinds>();

初始化结构列表

private void PrinterToGridBindingInit()
        {
            for (int i = 0; i < PrinterNumber; i++)
            {
                lst_PrinterToGridBindings.Add(new PrinterToGridBinds("Num " + (i + 1).ToString(), "-", "-", "-", "-", "-", "-"));
            }
        }

,并尝试将其与动态创建的标签绑定。下面的代码:

for (int i = 0; i < 8; i++)
            {
                Label lbl_PrinterName = new Label();
                lbl_PrinterName.Name = "Name_" + i.ToString();
                Binding lbl_Binding = new Binding {Path = new PropertyPath(lst_PrinterToGridBindings[i].extPrinterName), Mode = BindingMode.OneWay };               
                lbl_PrinterName.SetBinding(Label.ContentProperty, lbl_Binding);

                Grid.SetRow(lbl_PrinterName, i + 2);
                Grid.SetColumn(lbl_PrinterName, 3);
                grd_WorkArea.Children.Add(lbl_PrinterName);
            }

程序运行后,我看不到任何结果。另一方面,如果我定义属性

public string PropName1 { get; set; } = "PropTest";

并将此属性添加到绑定中,如下所示:

Binding lbl_Binding = new Binding {Path = new PropertyPath("PropName1"), Mode = BindingMode.OneWay };

所有作品都像魅力!我的错误在哪里?如何动态地将结构数据与标签绑定?

2 个答案:

答案 0 :(得分:1)

好像,对于您的工作样本(使用PropName),您可以在属性路径中定义属性名称,但是对于打印机,您可以定义属性值lst_PrinterToGridBindings[i].extPrinterName。看看msdn。您还应该指定Source进行绑定

答案 1 :(得分:0)

为了显示元素列表,请使用ItemsControl。将其ItemsSource属性分配或绑定到项目对象的集合。将其ItemTemplate设置为具有绑定到item类属性的UI元素的DataTemplate。

<ItemsControl x:Name="printerList">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding extPrinterName}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

后面的代码:

printerList.ItemsSource = lst_PrinterToGridBindings;

有关详细信息,请参见Data Templating Overview