Изменение содержимого кнопки в пользовательском элементе управления при нажатии - PullRequest
0 голосов
/ 28 мая 2019

Я понимаю, что 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" не портит и все просто работает. Что за? Почему это простое задание так сложно и почему так много поведения?

1 Ответ

0 голосов
/ 28 мая 2019

Не устанавливайте Button.Content напрямую, если на нем установлена ​​привязка. Если вы установите Button.Content в Конструкторе, вы фактически удалите привязку. Это работает:

<Window x:Class="StackOverflow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Button Content="{Binding Path=ButtonText1, RelativeSource={RelativeSource AncestorType=Window}}"  Click="Button1_OnClick"></Button>
    </StackPanel>
</Window>

using System.Windows;

namespace StackOverflow
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            ButtonText1 = "Paul";
        }

        private void Button1_OnClick(object sender, RoutedEventArgs e)
        {
            ButtonText1 = "Maria";
        }

        public string ButtonText1
        {
            get => (string)GetValue(ButtonText1Property);
            set => SetValue(ButtonText1Property, value);
        }

        // Using a DependencyProperty as the backing store for ButtonText1.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ButtonText1Property =
            DependencyProperty.Register("ButtonText1", typeof(string), typeof(MainWindow), new PropertyMetadata("Peter"));


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