Не удается найти цель триггера… цель должна появиться раньше

#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.