[英]Binding a WPF control to an Object
我有一个名为“ Employee”的对象,如下所示:
class Employee
{
public string EmpName { get; set; }
public string Surname { get; set; }
public Employee(string Name, string Surname) : base()
{
this.EmpName = EmpName;
this.Surname = Surname;
}
public Employee()
{
}
}
我在这里也有这个简单的“ EmployeeControl”。 网格中只有两个标签:
<UserControl x:Class="LabelBindingTest.EmployeeCtrl"
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"
Name="EmpCtrl"
d:DesignHeight="120" d:DesignWidth="411">
<Grid>
<Label Content="{Binding ElementName=EmpCtrl, Path=EmpName}" Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="81" />
<Label Content="{Binding ElementName=EmpCtrl, Path=Surname}" Height="28" HorizontalAlignment="Right" Name="label2" VerticalAlignment="Top" Width="81" />
</Grid>
</UserControl>
(编辑)EmployeeControl代码背后:
public partial class EmployeeCtrl : UserControl
{
Employee thisEmployee = new Employee();
public string EmpName
{
get
{
return thisEmployee.EmpName;
}
set
{
thisEmployee.EmpName = value;
}
}
public string Surname
{
get
{
return thisEmployee.EmpName;
}
set
{
thisEmployee.EmpName = value;
}
}
public EmployeeCtrl()
{
InitializeComponent();
}
}
现在,我想做的是在窗口中添加“ EmployeeControl”并将其绑定到Employee对象。 这是我的“窗口”代码:
<Window x:Class="LabelBindingTest.MainWindow"
Name="myWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:LabelBindingTest">
<Grid>
<my:EmployeeCtrl EmpName="Daniel" Surname="Hammond" HorizontalAlignment="Left" Margin="23,26,0,0" x:Name="employeeCtrl1" VerticalAlignment="Top" Height="97" Width="429" />
</Grid>
</Window>
我已经尝试了多种方法,但是我无法使其正常工作。 它可以正常编译,但标签为空。 我只想将我的“ Employee”对象附加到“ EmployeeCtrl”控件。 关于如何解决这个问题有什么想法吗? 我今天读了很多关于装订的文章,但仍在挠头。 我不确定是否需要实现INotifyPropertyChanged,因为我现在仅在运行时之前设置员工姓名。
(编辑):我已经下载了Caliburn.Micro,并在最后一个答案中使用了相同的代码。 结果相同,窗口为空。
这是整个项目。 不过,所有代码都应粘贴在此问题中。 这只是为了方便起见。
好的,首先,我强烈建议您考虑MVVM,因为您的应用程序变得越来越复杂, 如果您使用的是MVVM ,请使用MVVM框架 。 我建议使用Caliburn.Micro ,它使您的视图合成变得容易得多。 还有其他可用的MVVM框架,因此请对其进行评估。
对于您的问题,问题在于您的用户控件未将其属性实现为依赖项属性。 在XAML中,您正在设置用户控件的EmpName
和Surname
属性,但是UI在构建用户控件后不知道它们的值已更改,因此不会自我更新。
使用MVVM模式时,可以在视图模型上实现INotifyPropetyChanged
,并在用户控件上实现依赖项属性 。 这两种技术都会将更改通知UI,并迫使其自行更新。
因此,对于您的用户控件,您可以执行以下操作:
public partial class EmployeeCtrl : UserControl
{
public static readonly DependencyProperty EmpNameProperty =
DependencyProperty.Register("EmpName", typeof(string),
typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null));
public static readonly DependencyProperty SurnameProperty =
DependencyProperty.Register("Surname", typeof(string),
typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null));
public EmployeeCtrl()
{
this.InitializeComponent();
}
public string EmpName
{
get { return (string)GetValue(EmpNameProperty); }
set { SetValue(EmpNameProperty, value); }
}
public string Surname
{
get { return (string)GetValue(SurnameProperty); }
set { SetValue(SurnameProperty, value); }
}
}
实际上,在此阶段您根本不需要使用Employee
类,因为您没有使用它,但是理想情况下,如果它的属性值在构造后会更改并且您有一个实例绑定到UI,并且它应该实现INotifyPropertyChanged
希望更新用户界面。
您需要在EmployeeCtrl的EmpName和Surname属性上实现INotifyPropertyChanged,因为此用户控件中的Label需要更新此属性值的值更改,以便Label可以更新其值。 因此,您必须对EmployeeCtrl的EmpName和Surname属性实施Notify更改,或仅对这两个属性使用依赖项属性。 希望这可以帮助!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.