在按钮触发器中绑定到Datacontext属性?

时间:2014-03-01 22:35:17

标签: wpf triggers datacontext

我理解我的问题但是我正在寻找解决方案的建议:

        <Button.Style>
            <Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}">
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="MouseOverControl" Value="True" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>

我正在尝试绑定到我的datacontext中的属性,基本上我想告诉DC当我的UI中的控件将鼠标放在它上面时。我想我只需要两个按钮就可以了,哪个结束都没关系,因此我不需要为复杂的解决方案而烦恼(希望如此)。

问题是它正在寻找显然不存在的Button.MouseOverControl,我想了解你如何去访问DC。

谢谢!

编辑:所以我试图沿着所附的财产/行为路线走下去,这是我到目前为止所做的:

public static class MouseBehaviour
{
    public static readonly DependencyProperty MouseOverProperty
        = DependencyProperty.RegisterAttached(
        "MouseOver",
        typeof(bool),
        typeof(MouseBehaviour),
        new FrameworkPropertyMetadata(false,
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            MouseOverBindingPropertyChanged));

    public static bool GetMouseOver(DependencyObject obj)
    {
        return (bool)obj.GetValue(MouseOverProperty);
    }

    public static void SetMouseOver(DependencyObject obj, bool value)
    {
        obj.SetValue(MouseOverProperty, value);
    }

    private static void MouseOverBindingPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as FrameworkElement;

        if (element != null)
        {
            // Unsure about this method..
        }

    }

}

此外,我已将此添加到我的按钮以尝试链接它们,它似乎有效:

ex:MouseBehaviour.MouseOver="{Binding MouseOverControl}"

然而没有任何反应,这是因为我认为它目前的工作方式错误,所以我希望我的DC属性能够改变,但我想要它,所以我的DC中的MouseOverControl反映了我的IsMouseOver属性的值按钮。它会如此简单:

SetMouseOver(element, element.IsMouseOver);

或类似的东西?

2 个答案:

答案 0 :(得分:1)

首先想到的是直接在viewmodel中将IsMouseOver属性绑定到MouseOverControl属性而没有触发器。不幸的是,这种情况is not supported

解决该限制的一种可能的解决方法是使用在IsMouseOver属性更改为在viewmodel中触发方法/命令时引发的事件。我们可以使用interaction triggers来做到这一点。由于IsMouseOverChanged事件不存在,我们可以使用2个事件(MouseEnterMouseLeave)作为替代。

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseEnter">
            <ei:CallMethodAction MethodName="MouseEnter" TargetObject="{Binding}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeave">
            <ei:CallMethodAction MethodName="MouseLeave" TargetObject="{Binding}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

然后在viewmodel中有相应的方法:

public void MouseEnter()
{
    MouseOverControl = true;
}

public void MouseLeave()
{
    MouseOverControl = false;
}

另一种可能的方法是为MouseOver创建附加行为,以便您可以将其绑定到viewmodel的属性,如演示in this blog post

答案 1 :(得分:0)

所以我最后通过添加自己的动作来更新属性来解决这个问题,因为CallMethodAction仅在我无法使用的Blend 4中可用。

这个问题给了我很大的帮助:Setting a property with an EventTrigger

特别是我想引导您在该页面上使用Neutrino的答案(Here),我需要改变的唯一部分是XAML实现:

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseEnter">
                <ex:SetPropertyAction PropertyName="MouseOverControl" TargetObject="{Binding}"
                                   PropertyValue="true" />
            </i:EventTrigger>
            <i:EventTrigger EventName="MouseLeave">
                <ex:SetPropertyAction PropertyName="MouseOverControl" TargetObject="{Binding}"
                                   PropertyValue="false"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

快速解释是当鼠标进入我添加了这些触发器的按钮时,它会在我的viewmodel / datacontext中设置一个属性来镜像这个,完美!感谢har07提供了几种替代解决方案,这些解决方案也适用于不同情况(如果我能找出附加行为!!)