改变其他人的财产

时间:2010-01-12 08:31:50

标签: wpf properties

现在,我正在学习WPF。当WPF对象的属性发生更改时,我们可以更改另一个WPF对象的属性吗?

以下是简化方案。

我有WindowTextBox名为m_TextToggleButton名为m_Button。如果按下m_Text.Background,我想更改m_Button属性,即m_Button.IsChecked = true。我认为使用Trigger是可能的,但我不知道该怎么做。

P.S。如果可能的话,我想只在XAML中进行。

1 个答案:

答案 0 :(得分:1)

WPF使这非常简单 - 您可以将TextBox的Background属性直接数据绑定到ToggleButton上的IsChecked属性。当然,您需要将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>

更新:根据Ivan的优秀建议 - 已更新以显示如何将参数从XAML传递到转换器......