#wpf #triggers #datatemplate
#wpf #триггеры #datatemplate
Вопрос:
Я получаю это предупреждение:
Не удается найти цель триггера ‘ ErrandPropertiesGroupBox
‘. (Цель должна появиться перед любыми установщиками, триггерами или условиями, которые ее используют.)
Вот XAML:
<UserControl.Resources>
<ResourceDictionary>
<ObjectDataProvider x:Key="ErrandData" />
<DataTemplate x:Key="GroupTemplate">
<GroupBox>
<GroupBox.Header>
<WrapPanel>
<Label Content="Group #" />
<Label Content="{Binding Path=df_groupOrder}" />
</WrapPanel>
</GroupBox.Header>
<ListBox ItemsSource="{Binding Path=df_errands}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Name="label1" Content="{Binding Path=TypeName}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="True">
<Setter TargetName="ErrandPropertiesGroupBox" Property="Background" Value="HotPink" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</GroupBox>
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources>
<WrapPanel Name="rootWrapPanel">
<ItemsControl ItemsSource="{Binding Source={StaticResource ErrandData}, Path=df_sequentialErrandGroup}" ItemTemplate="{StaticResource GroupTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<GroupBox Name="ErrandPropertiesGroupBox" Header="Errand Properties" />
</WrapPanel>
Как я могу это исправить? (В Google есть похожие сообщения, но я не могу собрать правильное решение из них.)
Ответ №1:
Установщик внутри DataTemplate
может ссылаться только на другие элементы управления внутри этого DataTemplate
(это его NameScope
). Итак, насколько я знаю, вы не можете сделать это так, как пытаетесь это сделать.
Я пытался выяснить, как это могло бы работать у вас, но меня смущает ваш код. Похоже, вы пытаетесь установить фон для a GroupBox
, который находится за пределами ItemsControl
, всякий раз, когда выбирается какой-либо элемент внутри ListBox
(который сам находится внутри StackPanel
)?
Мне кажется, это не имеет большого смысла. Можете ли вы пояснить, чего вы пытаетесь достичь?
Редактировать:
Основываясь на вашем комментарии ниже, я думаю, что я бы хотел использовать ViewModel
для этой цели. Привязка Visibility
GroupBox
к вашему ViewModel
, а затем обновление этого свойства в вашем ViewModel
по мере изменения выбора. Тогда, если вы хотите сделать другие объекты видимыми или невидимыми на основе того же самого, вам просто нужно будет привязаться к этому свойству, а не возиться с Triggers
и Setters
.
Комментарии:
1. О, точно… Я забыл об этом … что я имею в виду, так это показывать groupbox при выборе любого элемента в listbox. Изменение фона было просто более ранним тестом.
2. @jessejuicer Хорошо, исходя из этого, я отредактировал свой ответ, чтобы дать свою рекомендацию.
Ответ №2:
От нашего друга документация:
Вы можете присвоить этому свойству имя любого элемента в пределах области, в которой применяется набор установщиков (коллекция, частью которой является этот установщик). Обычно это именованный элемент, который находится в шаблоне, содержащем этот параметр.
Ваша цель находится за пределами области видимости, вы не должны изменять внешние объекты из некоторой DataTemplate.