Ваш параметр 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
.