我理解我的问题但是我正在寻找解决方案的建议:
<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);
或类似的东西?
答案 0 :(得分:1)
首先想到的是直接在viewmodel中将IsMouseOver
属性绑定到MouseOverControl
属性而没有触发器。不幸的是,这种情况is not supported。
解决该限制的一种可能的解决方法是使用在IsMouseOver
属性更改为在viewmodel中触发方法/命令时引发的事件。我们可以使用interaction triggers来做到这一点。由于IsMouseOverChanged
事件不存在,我们可以使用2个事件(MouseEnter
和MouseLeave
)作为替代。
<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提供了几种替代解决方案,这些解决方案也适用于不同情况(如果我能找出附加行为!!)