2

私の WPF XAML フォームには、プロパティにバインドする多くの要素があります。

1 つのプロパティごとに、次の手順を実行しています。

<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. 繰り返し要素を作成するためのItemsControlとのように、同一のUI要素のリストがある場合。ItemTemplate

私はあなたのコードに関するいくつかの問題を発見しました:

  1. OnCaptionPropertyChanged設定したメソッドではTextBlock.Text、これを行う必要はありません。このバインディングが更新を処理します。
  2. TBX11このメソッドを呼び出すプロパティ内でOnPropertyChanged("TBX11")、依存関係プロパティのゲッターまたはセッターにロジックを追加しないでください。これらが呼び出される保証はありません。
  3. あなたTextBlock.DataContextはそれ自体に設定されているので、Textバインディングは機能しません!
于 2012-04-15T06:57:06.373 に答える
0

どうにかして簡単にできるかわかりませんか?

CaliburnMicroのようなMVVMフレームワークを使用できます。

Caliburnを使用すると、XAMLを次のように書き換えることができます。

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