使用DependencyProperty添加逻辑以进行控制

时间:2016-07-08 15:51:33

标签: wpf dependency-properties

我需要使用DependencyProperty为用户控件添加一些逻辑。 我的逻辑应该改变UserControl内的控件的属性。

我想避免构建巨大的“依赖树”,因为我有很多用户控件。我只是想在我的窗口中使用绑定(而不是在嵌套的用户控件中)。

这是我的控制:

public partial class BucketElevatorControl : UserControl
{
    public BucketElevatorControl()
    {
        InitializeComponent();
    }

    public bool On
    {
        get
        {
            return (bool)GetValue(OnProperty);
        }
        set
        {
            SetValue(OnProperty, value);
        }
    }

    // Using a DependencyProperty as the backing store for IsOn.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty OnProperty = DependencyProperty.Register(
            "On",
            typeof(bool),
            typeof(BucketElevatorControl),
            new PropertyMetadata(
                false, PropertyChangedCallback
                ));



    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        // I want to do something with my UserControl child controls
    }
}

问题是:如何在后面的控制代码中做一些逻辑并利用数据绑定?

我的逻辑很复杂(绘制图形,动画等)。

2 个答案:

答案 0 :(得分:1)

您应该为要更改的属性创建CoerceValueCallbacks。那些回调设置了新值。当这个属性发生变化时,你会强迫其他属性,如下所示:

private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)

{
  dependencyObject.CoerceValue(MinReadingProperty);
  dependencyObject.CoerceValue(MaxReadingProperty);
}

答案 1 :(得分:0)

我不知道你的意思是什么"依赖树",但是如果你想根据控件依赖属性的变化改变模板中的东西状态,你可以做在控件模板中使用TemplateBinding和/或触发器。如果需要,请写value converters。您需要做的大部分工作可能都是这样做的。

如果您需要更复杂的逻辑,您还可以覆盖控件中的OnApplyTemplate(),并调用GetTemplateChild()以获取控件模板中的命名控件。例如,您可能要求模板在其中的某处TextBox调用PART_FooText;如果您从null获得GetTemplateChild("PART_FooText") as TextBox,则会抛出异常。如果TextBox在那里,请执行任何您喜欢的操作:处理事件,设置属性等。如果您愿意,请保留私有字段TextBox _PART_FooText;以便稍后在您的属性中更改它回调,其他事件或其他。