Я понимаю, что WPF все еще для меня - волшебство. Проблема кажется простой. У меня есть пользовательский элемент управления с кнопкой. Я хотел бы изменить содержание кнопки (текст) при нажатии.
Если я открою форму с пользовательским контролем без инициализации значения кнопки, а затем произнесу
void Button_Click(object sender, RoutedEventArgs e)
{
Button.Content = "New Value";
}
это работает.
Если я динамически инициализирую значение кнопки в конструкторе элемента управления Button.Content = "Init Value"
, второй бит Button.Content = "New Value"
никогда не происходит (это случается, но текст кнопки больше не показывает изменения, по крайней мере, то, что кажется).
Поэтому я решил использовать привязку. Объявил свойство ButtonText
в MyUserControl (+ соответствующий DependencyProperty с getter и setter) и попытался сделать ButtonText = "Init Value";
в конструкторе и ButtonText = "New Value";
в Button_Click()
. Первый работает, второй все еще нет. Я предполагаю из-за неправильного контекста данных в Button_Click()
?
В MyUserControl я попробовал несколько вещей, включая
<Button x:Name="Button"
Content="{Binding Path=ButtonText, RelativeSource={RelativeSource AncestorType=UserControl}}"
Click="Button_Click" />
<Button x:Name="Button"
Content="{Binding Path=ButtonText, Element=MyUserControl}"
Click="Button_Click" />
и, кажется, ничего не работает.
Какой самый простой способ достичь того, что мне нужно, то есть как динамическая инициализация, так и динамическое изменение? С объяснением, если возможно, пожалуйста, почему мой первый (прямой) подход не работает и что отсутствует обязательный подход.
Большое спасибо!
EDIT:
Альтернативой может быть использование триггеров.
Этот пример работает:
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content" Value="Init Value"/>
<Style.Triggers>
<Trigger Property="IsClicked" Value="True">
<Setter Property="Content" Value="New Value" />
</Trigger>
</Style.Triggers>
</Style>
Моя проблема в том, что мне нужен DataTrigger, как этот
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content" Value="Init Value"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=MyUserControlProperty, ElementName=MyUserControl}" Value="True">
<Setter Property="Content" Value="New Value" />
</DataTrigger>
</Style.Triggers>
</Style>
Как правильно настроить изменение значения MyUserControlProperty?
Самое смешное, если я открываю элемент управления как новую форму, инициализация Button.Content = "Init Value"
не портит и все просто работает. Что за? Почему это простое задание так сложно и почему так много поведения?