如何为WPF属性制作模板?

时间:2012-04-15 06:50:47

标签: c# wpf templates properties

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

2 个答案:

答案 0 :(得分:1)

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

  1. 引入用户控件以减少重复的XAML和C#代码。有关详细信息,请参阅this tutorial I wrote
  2. 如果您有相同的UI元素列表,则ItemsControl的{​​{1}}可以创建重复的元素。
  3. 我发现您的代码存在一些问题:

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

答案 1 :(得分:0)

  

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

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

Caliburn将允许您将XAML重写为

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