2

在我的 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 块名称和绑定名称。

4

2 回答 2

1

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

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

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

  1. 在您OnCaptionPropertyChanged设置的方法中TextBlock.Text,您不应该这样做 - 此绑定将负责更新!
  2. 在您TBX11调用此方法的属性OnPropertyChanged("TBX11")中,您不应向依赖属性的 getter 或 setter 添加任何逻辑。不能保证这些会被调用。
  3. TextBlock.DataContext的设置为自身,因此Text绑定将不起作用!
于 2012-04-15T06:57:06.373 回答
0

我不知道我是否可以让它变得更容易?

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

Caliburn 将允许您将 XAML 重写为

 <TextBlock Grid.Column="0" Grid.Row="0" Name="TB11"  
        VerticalAlignment="Center" HorizontalAlignment="Center"/> 
于 2012-04-15T06:56:43.800 回答