【问题标题】:Is it possible to set element's own property?是否可以设置元素自己的属性?
【发布时间】:2017-03-23 07:53:21
【问题描述】:

我正在尝试使用 Setter 在 DataTrigger 中设置扩展器 IsExpanded 属性。

<ItemsControl.ItemTemplate>
   <DataTemplate>
      <Expander x:Name="myExpander" />
      <DataTemplate.Triggers>
         <DataTrigger Binding="{Binding ElementName=myExpander, Path=IsKeyboardFocusWithin}" Value="False">
             <Setter TargetName="Self" Property="IsExpanded" Value="False" />
         </DataTrigger>
      </DataTemplate.Triggers>
   </DataTemplate>
</ItemsControl.ItemTemplate>

问题是当我写这样的代码时

TargetName="myExpander"

我想要一些关键字,例如“self”或“.” - 将 Setter 目标与其父元素相关联并找到它的东西。

【问题讨论】:

  • 您可以省略 TargetName。没有目标就是自我。
  • 当我省略 TargetName 时,会出现编译错误。它说找不到模板属性“IsExpanded”
  • Trigger 是为了一件事,而Expander 是另一件事。它们不是易于使用的关系(不是SelfRelativeSource)。使用名称来引用元素是完全可以的。有名字有什么问题?
  • 所以,在看到stackoverflow.com/questions/18403929/…这个话题后,我意识到触发器并不适合你想要的东西,你必须使用转换器。

标签: c# wpf xaml datatrigger expander


【解决方案1】:

我认为您正在寻找的是:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Expander x:Name="myExpander" />
        <DataTemplate.Triggers>
            <Trigger SourceName="myExpander" Property="IsKeyboardFocusWithin" Value="False">
                <Setter TargetName="myExpander" Property="IsExpanded" Value="False" />
            </Trigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ItemsControl.ItemTemplate>

请注意,我使用TriggerSourceName 而不是DataTrigger(尽管后者也可以使用)。至于Setter,您需要设置TargetName="myExpander" 才能设置扩展器的属性——如果您没有指定TargetName,setter 将尝试设置DataTemplate 本身的属性。

至少这是理论上的解决方案。在实践中它不会起作用(或者至少不像你期望的那样),因为基于IsKeyboardFocusWithin 的触发器对于我认为你想要实现的目标来说不是一个好的选择。更好的选择是订阅LostFocus 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多