WPF - Freezable的按钮样式不继承DataContext

时间:2011-02-05 21:39:51

标签: wpf datacontext attached-properties

我在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?

2 个答案:

答案 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>

您显然必须根据具体情况调整相对来源的参数。看来,无论出于何种原因,附加属性都不会继承数据上下文,因此您必须告诉它是否如何。