是否可以设置元素自己的属性?
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>
请注意,我使用 Trigger
和 SourceName
而不是 DataTrigger
(尽管后者也可以)。至于 Setter
,您需要设置 TargetName="myExpander"
才能设置扩展器的 属性 - 如果您没有指定 TargetName
,则 setter 将尝试在 DataTemplate
本身上设置 属性。
至少这是理论上的解决方案。在实践中它不会工作(或者至少不会像您期望的那样),因为基于 IsKeyboardFocusWithin
的触发器对于我认为您想要实现的目标来说不是一个好的选择。更好的选择是订阅 LostFocus
事件。
我正在尝试使用 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>
请注意,我使用 Trigger
和 SourceName
而不是 DataTrigger
(尽管后者也可以)。至于 Setter
,您需要设置 TargetName="myExpander"
才能设置扩展器的 属性 - 如果您没有指定 TargetName
,则 setter 将尝试在 DataTemplate
本身上设置 属性。
至少这是理论上的解决方案。在实践中它不会工作(或者至少不会像您期望的那样),因为基于 IsKeyboardFocusWithin
的触发器对于我认为您想要实现的目标来说不是一个好的选择。更好的选择是订阅 LostFocus
事件。