现在,我正在学习WPF。当WPF对象的属性发生更改时,我们可以更改另一个WPF对象的属性吗?
以下是简化方案。
我有Window
个TextBox
名为m_Text
,ToggleButton
名为m_Button
。如果按下m_Text.Background
,我想更改m_Button
属性,即m_Button.IsChecked = true
。我认为使用Trigger
是可能的,但我不知道该怎么做。
P.S。如果可能的话,我想只在XAML中进行。
答案 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传递到转换器......