如何为 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 块名称和绑定名称。

如何为 WPF 属性制作模板

有几种方法可以减少重复:

  1. 引入用于减少重复 XAML 和 C# 代码的用户控件。有关更多详细信息,请参阅我编写的本教程。
  2. 如果您有相同 UI 元素的列表,则作为ItemsControlItemTemplate创建重复的元素。

我发现了您的代码的一些问题:

  1. 在您的OnCaptionPropertyChanged方法中,您设置了TextBlock.Text,您不应该这样做 - 此绑定将负责更新!
  2. TBX11属性中,OnPropertyChanged("TBX11")调用此方法,不应向依赖项属性的 getter 或 setter 添加任何逻辑。无法保证会调用这些内容。
  3. 您的TextBlock.DataContext设置为自身,因此Text绑定将不起作用!

我不知道我是否可以以某种方式使它变得更容易?

你可以使用像Caliburn Micro这样的MVVM框架。

Caliburn 将允许你将 XAML 重写为

 <TextBlock Grid.Column="0" Grid.Row="0" Name="TB11"  
        VerticalAlignment="Center" HorizontalAlignment="Center"/>