我在AttachedCommandBehavior library here之后建模附加的命令模式。我的按钮看起来像这样:
<Button>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="vms:Attached.Behaviors">
<Setter.Value>
<vms:Behaviors>
<vms:Behavior Event="Click"
Command="{Binding ClickCommand}" />
</vms:Behaviors>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
一切都很好,但是当执行Behavior
上的setter时,命令为null
。
行为是Freezable
,行为是FreezableCollection<Behavior>
。它似乎没有从Button继承DataContext。
另一方面,这可以正常工作:
<Button>
<vms:Attached.Behaviors>
<vms:Behavior Event="Click" Command="{Binding ClickCommand}" />
</vms:Attached.Behaviors>
</Button>
不幸的是我不能这样做,因为我需要使用ListViewItem
定位生成的ItemContainerStyle
。
有没有办法在Style中获取DataContext?
答案 0 :(得分:1)
附加命令行为库是成为混合行为的想法的萌芽。混合行为更加强大和标准化,因此我建议您切换到使用它们。但无论您是使用附加命令行为还是混合行为,问题都是必不可少的:当尝试使用样式设置它们时,它们无法按预期工作。我已经解决了Blend Behaviors的这个问题,完全支持StackOverflow答案中的绑定:
如果不测试它,我猜你必须将ACB行为移动到标有x:Shared="False"
的资源,以使绑定生效。
答案 1 :(得分:0)
我遇到了同样的问题,使用RelativeSource就可以了。我会告诉你我之前和之后的代码......
之前:(此DID无效)
<DataTemplate x:Key="MenuNodeWithChildrenTemplate">
<StackPanel Orientation="Horizontal"
behaviors:EventCommand.CommandToRun="{Binding OpenMenuItem}"
behaviors:EventCommand.EventName="MouseLeftButtonUp">
<Label Content="{Binding Title}"/>
<Label Content="{Binding Description}"/>
</StackPanel>
</DataTemplate>
之后:(这可以工作)
<DataTemplate x:Key="MenuNodeWithChildrenTemplate">
<StackPanel Orientation="Horizontal"
behaviors:EventCommand.CommandToRun="{Binding Path=DataContext.OpenMenuItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"
behaviors:EventCommand.EventName="MouseLeftButtonUp">
<Label Content="{Binding Title}"/>
<Label Content="{Binding Description}"/>
</StackPanel>
</DataTemplate>
您显然必须根据具体情况调整相对来源的参数。看来,无论出于何种原因,附加属性都不会继承数据上下文,因此您必须告诉它是否如何。