1

DataTriggerを継承したスペシャルを作りたいTriggerBase<FrameworkElement>。と同様に、DataTriggertype のプロパティがクラスBindingBaseで定義されています。MyDataTrigger

その変更を追跡するためにどのように聞くことができますか?

public class MyDataTrigger : TriggerBase<FrameworkElement>
{
    ...

    /// <summary>
    /// [Wrapper property for BindingProperty]
    /// <para>
    /// Gets or sets the binding that produces the property value of the data object.
    /// </para>
    /// </summary>
    public BindingBase Binding
    {
        get { return (BindingBase)GetValue(BindingProperty); }
        set { SetValue(BindingProperty, value); }
    }

    public static readonly DependencyProperty BindingProperty =
        DependencyProperty.Register("Binding",
                                    typeof(BindingBase),
                                    typeof(MyDataTrigger),
                                    new FrameworkPropertyMetadata(null));

}

アップデート:

BindingBase主な問題は、関連する を見つける方法がわからないことDependencyPropertyです。DP の聞き方を知っています。

void ListenToDP(object component, DependencyProperty dp)
{
    DependencyPropertyDescriptor dpDescriptor = DependencyPropertyDescriptor.FromProperty(dp, component.GetType());
    dpDescriptor.AddValueChanged(component, DPListener_ValueChanged);
}

デリゲートDPListener_ValueChangedはどこですか。EventHandlerここで、コンポーネントパラメータの値はthis.AssociatedObjectです。

4

1 に答える 1

0

よし、発見!

この回答を考慮すると、Binding は DP ではありません。そこで、Binding に関連付けられた DP を見つけようとしました。

Type type = Binding.GetType();
PropertyPath propertyPath = (PropertyPath)(type.GetProperty("Path").GetValue(Binding));
string propertyName = propertyPath.Path;

完全なコード:

public class MyDataTrigger : TriggerBase<FrameworkElement>
{
    ...

    public BindingBase Binding
    {
        get;
        set;
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        if (Binding != null && this.AssociatedObject.DataContext != null)
            //
            // Adding a property changed listener..
            //
            Type type = Binding.GetType();
            PropertyPath propertyPath = (PropertyPath)(type.GetProperty("Path").GetValue(Binding));
            string propertyName = propertyPath.Path;

            TypeDescriptor.GetProperties(this.AssociatedObject.DataContext).Find(propertyName, false).AddValueChanged(this.AssociatedObject.DataContext, PropertyListener_ValueChanged);
    }

    private void PropertyListener_ValueChanged(object sender, EventArgs e)
    {
        // Do some stuff here..
    }
}
于 2013-04-09T09:10:09.050 に答える