是否可以设置元素自己的属性?

Is it possible to set element's own property?

我正在尝试使用 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 目标与其父元素相关联并找到它的东西。

我想你要找的是这个:

<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 事件。