将 WPF 控件绑定到对象
本文关键字:对象 绑定 控件 WPF | 更新日期: 2023-09-27 18:00:06
我有一个名为"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()
{
}
}
我这里也有这个简单的"员工控制"。网格中只有两个标签:
<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>
(编辑(员工控制代码隐藏:
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>
我已经尝试了各种各样的方法,但我就是无法让它工作。它编译得很好,但标签是空的。我只想将我的"员工"对象附加到"员工Ctrl"控件。关于我如何解决这个问题的任何想法?我今天读了很多关于绑定的内容,但我仍然在挠头。我不确定我是否需要实现 INotifyPropertyChanged 因为我现在只在运行时之前设置员工姓名。
(编辑(:我已经下载了Caliburn.Micro,并在最后一个答案中使用相同的代码。相同的结果,空窗口。
这是整个项目。不过,它的所有代码都应该粘贴到这个问题中。这只是为了方便起见。
http://www.mediafire.com/?gux3573rz64mupe
好的,首先,我强烈建议考虑 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
类,因为你没有使用它,但理想情况下,它应该实现INotifyPropertyChanged
如果它的属性值在构造后会改变,并且你有一个实例绑定到 UI,并且你希望更新 UI。
在 EmployeeCtrl 的 EmpName 和 Surname 属性上实现 INotifyPropertyChanged,因为此用户控件中的标签需要更新有关此属性值中的值更改,以便标签可以更新其值。因此,您必须在 EmployeeCtrl 的 EmpName 和 Surname 属性上实现通知更改,或者只是对这两个属性使用依赖项属性。希望这有帮助!!