C#WPF绑定值不会在用户控件中触发动画

时间:2018-08-07 07:52:21

标签: c# wpf binding

你好,我在绑定用户控件动画时遇到问题,在我将数据绑定到用户控件(布尔类型)后,它为用户控件数据设置了正确的值,但没有触发动画,我尝试使用PropertyChangedCallback但没有运气好的用户控制代码如下:

        private static Switch_box AppWindow;

    public Switch_box()
    {
        InitializeComponent();
        AppWindow = this;
    }


    public static readonly DependencyProperty CheckboxStatusProperty = DependencyProperty.Register(nameof(CheckboxStatus), typeof(bool), typeof(Switch_box), new PropertyMetadata(false, new PropertyChangedCallback(OnCurrentReadingChanged)));//cant remove static otherwise throws error

    public bool CheckboxStatus
    {
        get
        {
            return (bool)GetValue(CheckboxStatusProperty);
        }
        set
        {
           /* if (value == true)
            {
                ((Storyboard)FindResource("OnChecking")).Begin(this);
            }
            else
            {
                ((Storyboard)FindResource("OnUnchecking")).Begin(this);
            }*/
            SetValue(CheckboxStatusProperty, value);
        }
    }


    private static void OnCurrentReadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)//cant remove static due to PropertyChangedCallBack requires static otherwise it throws error
    {
        AppWindow.OnChecking((bool)d.GetValue(CheckboxStatusProperty));
    }

    private void OnChecking(bool Status)
    {
        switch (Status)
        {
            case true:
                {
                    ((Storyboard)FindResource("OnChecking")).Begin(this);
                    break;
                }
            case false:
                {
                    ((Storyboard)FindResource("OnUnchecking")).Begin(this);
                    break;
                }
        }
    }

和我的usercontrol绑定行:

<local:Switch_box Tag="{Binding Index,IsAsync=True}" Checked="Switch_box_Checked" Unchecked="Switch_box_Unchecked" CheckboxStatus="{Binding IsEnabled,IsAsync=True}"/>

更改CheckboxStatus变量后如何触发动画?

编辑1:更新的代码。

1 个答案:

答案 0 :(得分:2)

有一个命名约定。 _StatusBox应该命名为CheckboxStatusProperty,并且应该是公开的:

public static readonly DependencyProperty CheckboxStatusProperty =
    DependencyProperty.Register(
        nameof(CheckboxStatus), typeof(bool), typeof(Switch_box),
        new PropertyMetadata(false, OnCurrentReadingChanged));

除了依赖属性的CLR包装中的GetValueSetValue外,您不得调用其他任何内容。然后,您在当前实例上调用方法,而不是在静态字段上调用:

public bool CheckboxStatus
{
    get { return (bool)GetValue(CheckboxStatusProperty); }
    set { SetValue(CheckboxStatusProperty , value); }
}

在PropertyChangedCallback中,再次设置属性毫无意义。同样,您应该对当前的DependencyObject实例(即d)进行操作,而不要对静态字段进行操作:

private static void OnCurrentReadingChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((Switch_box)d).OnChecking((bool)e.NewValue);
}

private void OnChecking(bool status)
{
    if (status)
    {
        ((Storyboard)FindResource("OnChecking")).Begin(this);
    }
    else
    {
        ((Storyboard)FindResource("OnUnchecking")).Begin(this);
    }
}