0

内部使用のためにいくつかの UserControls を開発する際に、MSDN http://msdn.microsoft.com/en-us/library/vstudio/ee712573(v=vs.100).aspxの例に従いました。

1 つのコントロールのパブリック値が別のコントロールによって使用されます。私が現在これを機能させている方法は、分離コードを介して最初のコントロールで発生するイベントにフックすることです。コード ビハインドの必要性を排除するプロパティ DependencyProperties の 1 つまたは両方を作成することを考えています。

public partial class UserControl1 : UserControl
{
    private DataModel1 dm;
    public UserControl1()
    {
        this.DataContext = new DataModel1();
        dm = (DataModel1)DataContext;
        InitializeComponent();
    }
    public DataValue CurrentValue
    {
        get { return dm.CurrentValue; }
        set { dm.CurrentValue = value; }
    }
}
public class DataModel1 : INotifyPropertyChanged
{
    private DataValue _myData = new DataValue();
    public DataValue CurrentValue
    {
        get { return _myData; }
        set { if (_myData != value) {_myData = value OnPropertyChanged("CurrentValue"); }
    }
    // INotifyPropertyChanged Section....
}

DataModel1プロパティは、クラスからの単なるパススルーです。

どちらの UserControls も構造が非常に似ており、同じパブリック プロパティを持っています。イベントハンドラーの背後にあるコードを同様のバインディングに置き換えたいと思います。次のように思います。

<my:UserControl1 Name="UserControl1" />
<my:UserControl2 CurrentValue={Binding ElementName="UserControl1", Path="CurrentValue"} />

ただし、DependencyProperties の標準的な例には、パススルーを許可する代わりに、生成されたバッキング オブジェクトを使用するGetValueおよび関数を使用するゲッターとセッターがあります。SetValue

public DataValue CurrentValue
{
    get { return (DataValue)GetValue(CurrentValueProperty); }
    set { SetValue(CurrentValueProperty, value); }
}

DP は次のようになるはずです。

public static readonly DependencyProperty CurrentValueProperty = 
        DependencyProperty.Register("CurrentValue", typeof(DataValue), typeof(UserControl1));

パブリック バッキング プロパティの定義を変更して、データバインディング パススルーをサポートするにはどうすればよいですか?

4

1 に答える 1

0

OnPropertyChanged イベントにジャンプすると、データをDataModel1. これが正しい答えであると 100% 確信しているわけではありませんが、仕事は完了します。

修正されたコードは次のとおりです。

public static readonly DependencyProperty CurrentValueProperty =
       DependencyProperty.Register("CurrentValue", typeof(DataValue), typeof(UserControl1),
       new PropertyMetadata(new PropertyChangedCallback(OnCurrenValueChanged)));
private static void OnCurrentValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UserControl1 uc = d as UserControl1;
        if (e.NewValue != null)
        {
            uc.dm.CurrentValue = e.NewValue as DataValue;
        }
    }
public DataValue CurrentValue
{
        get { return GetValue(CurrentValueProperty) as DataValue; }
        set { SetValue(CurrentValueProperty, value); }
    }
于 2013-01-28T15:23:28.590 に答える