首页 > 解决方案 > 如何设置绑定到未在 XAML 代码中实例化的元素

问题描述

我对编码比较陌生,我正在做一个小项目。这就是我想要做的:

我定义了一个具有两个属性的类“MyObject”:

namespace WpfApplication2
{
  public class MyObject
  {
    public string Property1 { get; set; }
    public int Property2 { get; set; }

    public MyObject() : this("", 0)
    {
    }

    public MyObject(string p1, int p2)
    {
        Property1 = p1;
        Property2 = p2;
    }
  }
}

...然后在代码中实例化这个类的两个对象:

namespace WpfApplication2
{

  public partial class MainWindow : Window
  {
    public List<MyObject> listOfMyObject { get; set; }
    public MyObject myObj1 { get; set; }
    public MyObject myObj2 { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        listOfMyObject = new List<MyObject>();
        myObj1 = new MyObject("Hello", 1);
        myObj2 = new MyObject("Bye", 2);
        listOfMyObject.Add(myObj1);
        listOfMyObject.Add(myObj2);
    }
  }
}

现在我想将两个 MyObject 对象的每个属性绑定到 Label 对象的 Content 属性。所以应该有四个 Label 对象: - Label1 应该显示 myObj1 的 Property1 的值 - Label2 应该显示 myObj1 的 Property2 的值​​ - Label3 应该显示 myObj2 的 Property1 的值 - Label4 应该显示 myObj2 的 Property2 的值

我试过这样:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication2"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" Name="mywin">
  <Grid>
      <StackPanel Grid.Row="1"  Orientation="Horizontal">
        <StackPanel>
            <Label Name="Label1" Content="{Binding ElementName=myObj1, Path=Property1}"/>
            <Label Name="Label2" Content="{Binding ElementName=myObj1, Path=Property2}"/>
        </StackPanel>
        <StackPanel>
            <Label Name="Label3" Content="{Binding ElementName=myObj2, Path=Property1}"/>
            <Label Name="Label4" Content="{Binding ElementName=myObj2, Path=Property2}"/>
        </StackPanel>
    </StackPanel>
  </Grid>
</Window>

...但它不起作用。请帮助我了解如何正确使用绑定!

问候

标签: binding

解决方案


// 即使我已经想出了如何解决我的问题,我也会很高兴, // 如果有人能回答本文末尾的问题!

好的,现在我想出了(在朋友的帮助下),如何解决我的问题:

我通过执行以下操作设置了 MainWindow 对象的 DataContext 属性,该属性包含 Label 对象自身:

mywin.DataContext = this;

所以代码现在看起来像这样:

public partial class MainWindow : Window
{
    public List<MyObject> listOfMyObject { get; set; }

    public MyObject myObj1 { get; set; }

    public MyObject myObj2 { get; set; }


    public MainWindow()
    {
        InitializeComponent();
        listOfMyObject = new List<MyObject>();
        myObj1 = new MyObject("Hello", 1);
        myObj2 = new MyObject("Bye", 2);
        listOfMyObject.Add(myObj1);
        listOfMyObject.Add(myObj2);

        // I added this code
        mywin.DataContext = this;
    }

}

然后我通过执行以下操作将绑定设置为四个 Label 对象的 Content 属性:

<Label Name="Label1" Content="{Binding Path=myObj1.Property1}" />

所以我的整个 XAML 代码现在看起来像这样:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication2"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" Name="mywin">
  <Grid>
    <StackPanel Grid.Row="1"  Orientation="Horizontal">
        <StackPanel>
            <Label Name="Label1" Content="{Binding Path=myObj1.Property1}" />
            <Label Name="Label2" Content="{Binding Path=myObj1.Property2}" />
        </StackPanel>
        <StackPanel>
            <Label Name="Label3" Content="{Binding Path=myObj2.Property1}" />
            <Label Name="Label4" Content="{Binding Path=myObj2.Property2}" />
        </StackPanel>
    </StackPanel>
  </Grid>
</Window>

新问题:现在我想了解,为什么它不像我尝试的第一种方式那样工作......

<Label Name="Label1" Content="{Binding ElementName=myObj1, Path=Property1}"/>

...当这可行时:

<Label Name="Label1" Content="{Binding ElementName=Label2, Path=Content}"/>
<Label Name="Label2" Content="Hello">

XAML 代码(其中实例化了 Label 对象)和 C# 代码(其中实例化了 MyObject 对象)都是属于同一类的部分类。除此之外,MyObject 对象 myObj1 和 myObj2 是此类的属性。所以我认为 XAML 代码中的标签元素应该“了解”MyObject 对象 myObj1 和 myObj2,因此能够将它们作为 Binding 对象的 ElementName 属性中的源元素进行引用。这样想,我想我必须只将 Binding 对象的 Path 属性设置为 Label 对象应该显示的值。你能帮我理解一下,我对 Binding 的想法是错误的吗?谢谢!


推荐阅读