如何为 WPF 属性制作模板
本文关键字:属性 WPF | 更新日期: 2023-09-27 18:31:04
在我的 WPF XAML 窗体上,我有很多绑定到属性的元素。
对于每个属性,我都会执行以下步骤:
<TextBlock Grid.Column="0" Grid.Row="0" Name="TB11" Text="{Binding TBX11}"
VerticalAlignment="Center" HorizontalAlignment="Center"
DataContext="{Binding RelativeSource={RelativeSource Self}}" />
和
#region TBX11
private static void OnXBPropertyChanged(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
table myUserControl = dependencyObject as table;
myUserControl.OnPropertyChanged("XB11");
myUserControl.OnCaptionPropertyChanged(e);
}
private void OnCaptionPropertyChanged(DependencyPropertyChangedEventArgs e) {
TB11.Text = TBX11;
}
public static readonly DependencyProperty TBX11Property =
DependencyProperty.Register("TBX11", typeof(string), typeof(table),
new PropertyMetadata(string.Empty, OnXBPropertyChanged));
public string TBX11 {
get { return GetValue(TBX11Property).ToString(); }
set {
SetValue(TBX11Property, value);
OnPropertyChanged("TBX11");
}
}
#endregion
我现在甚至无法意识到我需要在这里写多少次相同的内容,但我不知道我是否可以以某种方式让它变得更容易?因为我需要从这里设置的只是 WPF 块名称和绑定名称。
有几种方法可以减少重复:
- 引入用于减少重复 XAML 和 C# 代码的用户控件。有关更多详细信息,请参阅我编写的本教程。
- 如果您有相同 UI 元素的列表,则作为
ItemsControl
,ItemTemplate
创建重复的元素。
我发现了您的代码的一些问题:
- 在您的
OnCaptionPropertyChanged
方法中,您设置了TextBlock.Text
,您不应该这样做 - 此绑定将负责更新! - 在
TBX11
属性中,OnPropertyChanged("TBX11")
调用此方法,不应向依赖项属性的 getter 或 setter 添加任何逻辑。无法保证会调用这些内容。 - 您的
TextBlock.DataContext
设置为自身,因此Text
绑定将不起作用!
我不知道我是否可以以某种方式使它变得更容易?
你可以使用像Caliburn Micro这样的MVVM框架。
Caliburn 将允许你将 XAML 重写为
<TextBlock Grid.Column="0" Grid.Row="0" Name="TB11"
VerticalAlignment="Center" HorizontalAlignment="Center"/>