binding - 如何设置绑定到未在 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>
...但它不起作用。请帮助我了解如何正确使用绑定!
问候
解决方案
// 即使我已经想出了如何解决我的问题,我也会很高兴, // 如果有人能回答本文末尾的问题!
好的,现在我想出了(在朋友的帮助下),如何解决我的问题:
我通过执行以下操作设置了 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 的想法是错误的吗?谢谢!
推荐阅读
- unit-testing - Quarkus - 如何为我的测试方法创建具有特定行为的模拟
- python - 在 Python 中计算文件中的单词和行数
- amazon-web-services - AWS SageMaker 访问被拒绝
- javascript - 在不去除 HTML 标签的情况下添加 JQuery“阅读更多”脚本
- autodesk-forge - Forge 查看器 - 标记 - 编辑器
- php - Wordpress 查询 - 按 meta_value 排序 - php: time(); - 最大到最小的数字
- terraform - 在适用于 AWS 的 Terraform 标签中组合变量值和显式定义的变量值
- excel - 检查列中是否有“1”,如果有,则过滤
- c++ - 为什么我的 C++ 指向的对象在我的工厂模式中丢失了它的值?
- sql - 我可以在 SQL 表中插入 HTML 代码,因此,当从该表中检索到值时,它将被适当地格式化?