Изменить чужую собственность - PullRequest
0 голосов
/ 12 января 2010

Прямо сейчас я изучаю WPF. Можем ли мы изменить свойство другого объекта WPF при изменении свойства объекта WPF?

Ниже приведен упрощенный сценарий.

У меня есть Window с TextBox с именем m_Text и ToggleButton с именем m_Button. Я хочу изменить свойство m_Text.Background, если нажата m_Button, то есть m_Button.IsChecked = true. Я думаю, что это возможно, используя Trigger, но я не знаю, как это сделать.

P.S. Если возможно, я хочу сделать это только в XAML.

1 Ответ

1 голос
/ 12 января 2010

WPF делает это действительно легко - вы можете привязать свойство BackgroundBox к данным непосредственно к свойству IsChecked на ToggleButton. Конечно, вам нужно будет преобразовать IsChecked (логическое значение) в Brush, но WPF позволяет вам указывать объект Converter прямо в привязке ...

В коде вы создаете объект, который реализует IValueConverter, и реализует метод Convert, например

public class BoolToBrushConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool isChecked = (bool)value;

        string[] colours = parameter.ToString().Split(':');
        if (isChecked)
            return new BrushConverter().ConvertFromString(colours[0]);
        return new BrushConverter().ConvertFromString(colours[1]);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

тогда в xaml вам нужно добавить пространство имен, содержащее этот класс, объявить экземпляр конвертера как ресурс в окне, а затем использовать его в Binding ... оно должно выглядеть примерно так:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <local:BoolToBrushConverter x:Key="boolToBrushConverter" />
    </Window.Resources>

    <StackPanel Height="250">
        <ToggleButton Name="toggleButton" Height="32" Content="Green" />

    <TextBox
        Background="{Binding ElementName=toggleButton, Path=IsChecked, Converter={StaticResource boolToBrushConverter}, ConverterParameter=Green:White}" />
    </StackPanel>
</Window>

ОБНОВЛЕНИЕ : В соответствии с превосходным предложением Ивана - обновлены, чтобы показать, как вы можете передать параметры в конвертер из XAML ...

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