是否绑定到按钮触发器中的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>

我试图绑定到我的数据上下文中的一个属性,基本上我想告诉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);

或者类似的东西?

首先想到的是在视图模型中直接将IsMouseOver属性绑定到MouseOverControl属性,而无需触发器。不幸的是,该方案不受支持。

解决该限制的一种可能的解决方法是使用每当IsMouseOver属性更改为视图模型中的触发器方法/命令时引发的事件。我们可以使用交互触发器来做到这一点。由于IsMouseOverChanged事件不存在,我们可以使用两个事件(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>

然后在视图模型中有相应的方法:

public void MouseEnter()
{
MouseOverControl = true;
}
public void MouseLeave()
{
MouseOverControl = false;
}

另一种可能的方法是为MouseOver创建附加行为,以便将其绑定到viewmodel的属性,如本文所示。

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

这个问题对我帮助很大:用EventTrigger 设置属性

特别是,我想引导您了解用户Neutrino在该页面上的答案(此处),我唯一需要更改的部分是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>

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

最新更新