Установка свойств вложенного элемента управления WPF из родительского элемента управления - PullRequest
4 голосов
/ 26 марта 2009

У меня есть окно WPF с несколькими элементами управления ListBox, и все они используют один и тот же стиль, который я упростил здесь:

   <Style x:Key="listBox" TargetType="{x:Type ListBox}">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border BorderBrush="Black">
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Text="{Binding Path=name}" />
                            <TextBlock Text="{Binding Path=text}" />
                            <TextBlock Text="id:" />
                            <TextBlock x:Name="_idTextBlock" Text="{Binding Path=id}" />
                            <Button Name="btnGet" CommandParameter="{Binding Path=id}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

А вот пример одного из элементов управления ListBox, использующего этот стиль:

<ListBox x:Name="lbCampaigns" Button.Click="lbCampaigns_Click" ItemsSource="{Binding}" Style="{StaticResource listBox}" />

Как я могу установить Контент элемента управления Button (btnGet) из родительского ListBox?

Я знаю, какой текст я хочу, чтобы кнопка отображалась во время разработки для каждого ListBox в окне. (т.е. мне не нужно привязывать его к ListBox ItemsSource). Я вижу, что могу определить события дочернего элемента управления (см. Определение Button.Click), но, похоже, я не могу установить свойства дочернего элемента управления таким же образом.

Есть идеи? Спасибо!

1 Ответ

8 голосов
/ 26 марта 2009

Ваш параметр Button.Click не назначает обработчик событий для кнопки. Он присваивает его ListBox. Это работает из-за перенаправленной системы событий WPF.

Если вы хотите, чтобы Button принял значение, установленное на уровне ListBox, в этом случае можно использовать Binding с RelativeSource:

<Button Content="{Binding Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>

В этом случае я только что похитил свойство Tag, которое можно указать следующим образом:

<ListBox Tag="This is the button's content" .../>

Другой вариант - использовать унаследованное вложенное свойство. Например:

<Button Content="{Binding local:MyClass.MyAttachedProperty}"/>

А потом:

<ListBox local:MyClass.MyAttachedProperty="This is the button's content"/>

Наконец, если вы шаблонизировали сам ListBox, вы можете «протянуть руку» и привязать к свойству элемента управления, который вы шаблонизируете, используя TemplateBinding:

<Button Content="{TemplateBinding Tag}"/>

Конечно, этот метод обычно используется со свойствами, специально объявленными в шаблонном элементе управления. Например, вы можете создать подкласс ListBox и добавить собственное свойство ButtonContent. Затем в вашем шаблоне вы можете обратиться к этому свойству и связать его с Button.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...