TwoWay Binding is not working if Binding is changed from DataTrigger

时间:2015-06-15 14:58:27

标签: wpf datatemplate datatrigger 2-way-object-databinding

I have the following DataTemplate for my Tool Bar Items:

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

Everything works fine (my popup and my toggle button do work together as they should) But if I set the value of the Trigger of my DataTemplate (which is done by my business logic, or more specific by some "NavigationService") the Popup gets closed while the ToggleButton stays checked.

Why does my Trigger not change the IsChecked Property of my ToggleButton as well?

1 个答案:

答案 0 :(得分:1)

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

来自MSDN上的链接页面:

  

以下是物业系统使用的最终订单   在分配依赖项属性的运行时值时。最高   首先列出优先级。这个列表扩展了一些   在依赖属性概述中进行的泛化。

     
      
  1. 物业系统强制。有关强制的详细信息,请参阅本主题后面的强制,动画和基本值。

  2.   
  3. 动态动画或具有保留行为的动画。为了产生任何实际效果,财产的动画必须能够   优先于基数(非动画)值,即使该值也是如此   在当地设置。有关详细信息,请参阅强制,动画和基值   本主题的后面部分。

  4.   
  5. 本地价值。可以通过“wrapper”属性的方便来设置本地值,这也等同于设置为属性   或者XAML中的property元素,或者使用a调用SetValue API   特定实例的属性。如果使用a设置本地值   绑定或资源,这些在优先级中的行为就好像是直接的   价值已设定。

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

  8.         

    a.Triggers来自TemplatedParent模板。

         

    b.Property设置(通常通过XAML属性)   TemplatedParent模板。

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

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

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

    6.   
    7. 样式设定者。来自页面或应用程序的样式中的Setter的值。

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

    10.         

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

           

      b.Setters in the theme style。

           
          
      1. 继承。一些依赖属性从父元素继承它们的值到子元素,因此不需要设置它们   特别是在整个应用程序中的每个元素详情   请参阅属性值继承。

      2.   
      3. 依赖项属性元数据的默认值。任何给定的依赖属性都可以具有由。建立的默认值   该特定财产的财产制度登记。也,   继承依赖项属性的派生类具有选项   在每个类型上覆盖该元数据(包括默认值)   基础。有关更多信息,请参阅依赖属性元数据。因为   对于继承,在默认值之前检查继承   property,父元素默认值优先于子元素   元件。因此,如果未在任何地方设置可继承属性,   而是使用在根或父级上指定的默认值   子元素默认值。

      4.