Можно ли установить собственное свойство элемента?

Я пытаюсь установить свойство Expander IsExpanded внутри DataTrigger с помощью Setter.

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

Я хотел какое-то ключевое слово, такое как "я" или "." - то, что связывает цель Setter с элементами его родителя и находит его.

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>

Обратите внимание, что я использовал Trigger с SourceName скорее, чем DataTrigger (хотя последний тоже будет работать). Для Setterнужно установить TargetName="myExpander" для того, чтобы установить свойство вашего экспандера - если вы не указали TargetNameустановщик попытается установить свойство на DataTemplate сам.

По крайней мере, это теоретическое решение. На практике это не будет работать (или, по крайней мере, не так, как вы ожидаете), потому что триггер, основанный на IsKeyboardFocusWithin это не хороший выбор для того, что я думаю, вы пытаетесь достичь. Лучше было бы подписаться на LostFocus событие.

Другие вопросы по тегам