3

我的工具栏项目有以下 DataTemplate:

<DataTemplate DataType="{x:Type viewModels:PopupContextActionViewModel}">
   <Grid>
      <ToggleButton Name="ToggleButton">
         <ContentControl Template="{Binding Icon, Converter={StaticResource NameToResourceConverter}}" Margin="5" />
      </ToggleButton>
      <Popup Name="ContextActionPopup" StaysOpen="False" AllowsTransparency="True"
         IsOpen="{Binding 
            ElementName=ToggleButton, 
            Path=IsChecked, 
            Mode=TwoWay, 
            UpdateSourceTrigger=PropertyChanged}">
         <Border Background="Transparent" Name="Border" Visibility="Visible">
            <ContentControl x:Name="ContentControl" userInterface:RegionHelper.RegionName="{Binding RegionId}" Style="{StaticResource PopupContentStyle}" />
         </Border>
      </Popup>
   </Grid>
   <DataTemplate.Triggers>
      <Trigger SourceName="ContentControl" Property="Content" Value="{x:Null}">
         <Setter TargetName="ContextActionPopup" Property="IsOpen" Value="False" />
      </Trigger>
   </DataTemplate.Triggers>

一切正常(我的弹出窗口和我的切换按钮可以正常工作)但是如果我设置我的 DataTemplate 的触发器的值(由我的业务逻辑完成,或者更具体地由一些“NavigationService”完成)弹出窗口得到在 ToggleButton 保持选中状态时关闭。

为什么我的触发器也不会更改 ToggleButton 的 IsChecked 属性?

4

1 回答 1

2

您可以在 MSDN 上的Dependency Property Value Precedence页面中找到您的答案。简而言之,您在IsOpen属性上设置了一个本地值,并且该值的优先级高于Trigger. 解决方法是设置本地值,而是在 a 中设置初始值Style,其优先级低于Trigger.

从 MSDN 上的链接页面:

以下是属性系统在分配依赖属性的运行时值时使用的确定顺序。首先列出最高优先级。此列表扩展了依赖属性概述中的一些概括。

  1. 财产制度强制。有关强制的详细信息,请参阅本主题后面的强制、动画和基值。

  2. 活动动画,或具有 Hold 行为的动画。为了产生任何实际效果,属性的动画必须能够优先于基本(未动画)值,即使该值是在本地设置的。有关详细信息,请参阅本主题后面的强制、动画和基值。

  3. 当地价值。可以通过“包装器”属性的便利设置本地值,这也等同于在 XAML 中设置为属性或属性元素,或者通过使用特定实例的属性调用 SetValue API。如果您通过使用绑定或资源设置本地值,则它们各自的优先级就像设置了直接值一样。

  4. TemplatedParent 模板属性。如果元素是作为模板(ControlTemplate 或 DataTemplate)的一部分创建的,则该元素具有 TemplatedParent。有关何时适用的详细信息,请参阅本主题后面的 TemplatedParent。在模板中,以下优先级适用:

a.来自 TemplatedParent 模板的触发器。

b. TemplatedParent 模板中的属性集(通常通过 XAML 属性)。

  1. 隐式风格。仅适用于 Style 属性。Style 属性由任何样式资源填充,其键与该元素的类型匹配。该样式资源必须存在于页面或应用程序中;查找隐式样式资源不会进入主题。

  2. 风格触发器。来自页面或应用程序的样式中的触发器(这些样式可能是显式或隐式样式,但不是来自具有较低优先级的默认样式)。

  3. 模板触发器。来自样式中的模板或直接应用的模板的任何触发器。

  4. 风格制定者。来自页面或应用程序样式中的 Setter 的值。

  5. 默认(主题)样式。有关何时适用以及主题样式如何与主题样式中的模板相关的详细信息,请参阅本主题后面的默认(主题)样式。在默认样式中,应用以下优先顺序:

a.主题风格中的主动触发器。

b. 主题风格的设置者。

  1. 遗产。一些依赖属性将它们的值从父元素继承到子元素,因此不需要在整个应用程序的每个元素上专门设置它们。有关详细信息,请参阅属性值继承。

  2. 依赖属性元数据的默认值。任何给定的依赖属性都可能具有由该特定属性的属性系统注册建立的默认值。此外,继承依赖属性的派生类可以选择在每种类型的基础上覆盖该元数据(包括默认值)。有关详细信息,请参阅依赖属性元数据。因为在默认值之前检查继承,所以对于继承的属性,父元素默认值优先于子元素。因此,如果未在任何地方设置可继承属性,则使用在根或父元素上指定的默认值,而不是子元素的默认值。

于 2015-06-15T15:21:45.203 回答