内部使用のためにいくつかの 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));
パブリック バッキング プロパティの定義を変更して、データバインディング パススルーをサポートするにはどうすればよいですか?