Binding 如何设置与XAML代码中未实例化的元素的绑定

Binding 如何设置与XAML代码中未实例化的元素的绑定,binding,Binding,我对编码比较陌生,我正在做一个小项目。这就是我想要做的: 我定义了一个具有两个属性的类“MyObject”: namespace WpfApplication2 { public class MyObject { public string Property1 { get; set; } public int Property2 { get; set; } public MyObject() : this("", 0) { } publ

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

我定义了一个具有两个属性的类“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);
    }
  }
}
命名空间WpfApplication2
{
公共部分类主窗口:窗口
{
公共列表listOfMyObject{get;set;}
公共MyObject myObj1{get;set;}
公共MyObject myObj2{get;set;}
公共主窗口()
{
初始化组件();
listOfMyObject=新列表();
myObj1=新的MyObject(“你好”,1);
myObj2=新的MyObject(“再见”,2);
添加(myObj1);
添加(myObj2);
}
}
}
现在我想将两个MyObject对象的每个属性绑定到Label对象的Content属性。因此,应该有四个标签对象: -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>

。。。但它不起作用。请帮助我了解如何正确使用装订


问候

//即使我已经找到了解决问题的方法,我也会很高兴,//如果有人能在本文末尾回答这个问题

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

我通过以下操作将包含标签对象的MainWindow对象的DataContext属性设置为自身:

mywin.DataContext = this;
<Label Name="Label1" Content="{Binding Path=myObj1.Property1}" />
现在代码看起来像这样:

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;
    }

}
<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>
公共部分类主窗口:窗口
{
公共列表listOfMyObject{get;set;}
公共MyObject myObj1{get;set;}
公共MyObject myObj2{get;set;}
公共主窗口()
{
初始化组件();
listOfMyObject=新列表();
myObj1=新的MyObject(“你好”,1);
myObj2=新的MyObject(“再见”,2);
添加(myObj1);
添加(myObj2);
//我添加了这个代码
mywin.DataContext=this;
}
}
然后,通过执行以下操作,将绑定设置为四个Label对象的Content属性:

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

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

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;
    }

}
<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代码(其中标签对象被实例化)和C#代码(其中MyObject对象被实例化)都是属于一起的部分类。此外,MyObject对象myObj1和myObj2是此类的属性。因此,我认为XAML代码中的标签元素应该“知道”MyObject对象myObj1和myObj2,因此能够在绑定对象的ElementName属性中将它们作为源元素引用。通过这种方式,我认为我必须只将绑定对象的Path属性设置为Label对象应该显示的值。 你能帮我理解一下,我的装订观念哪里错了?谢谢大家!