2012-04-15 61 views
3

在我的WPF XAML表单中,我有很多元素绑定到我的属性上。如何为WPF属性创建模板?

对于每一个属性我做这个步骤:

<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

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

  1. 介绍用户控件减少重复XAML和C#代码。有关更多详细信息,请参阅this tutorial I wrote
  2. 如果您拥有相同UI元素的列表,请使用ItemsControlItemTemplate来创建重复元素。

我都看准了几个问题与您的代码:

  1. 在你OnCaptionPropertyChanged方法设置了TextBlock.Text,你应该noty做到这一点 - 这种结合会照顾的更新!
  2. 在你的TBX11属性中,你调用这个方法OnPropertyChanged("TBX11"),你不应该添加任何逻辑给依赖属性的getters或者setter。不保证这些将被调用。
  3. 您的TextBlock.DataContext已设置为自身,因此Text绑定不起作用!
1

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

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

卡利将让你重写你的XAML为

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

我真的不会建议增加一个依赖到一个复杂的MVVM框架只是为了消除一些重复。 WPF框架本身可以解决这个问题。 – ColinE 2012-04-15 06:58:04