你需要使用一个
值转换器(将字符串输入转换为颜色输出),而最简单的解决方案是向EmployeeViewModel添加至少一个属性。你需要创建一些形式的
默认值或
原始值属性,并进行比较。否则,你怎么知道“原始值”是什么呢?除非有东西保存原始值以便进行比较,否则你无法确定值是否已更改。
因此,绑定到文本属性并将输入字符串与视图模型上的原始值进行比较。如果已更改,则返回突出显示的背景颜色。如果匹配,则返回正常的背景颜色。如果要从单个文本框中一起比较FirstName和LastName,则需要使用多重绑定。
我构建了一个示例来演示如何工作:
<Window x:Class="TestWpfApplication.Window11"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
Title="Window11" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<local:ChangedDefaultColorConverter x:Key="changedDefaultColorConverter"/>
</Window.Resources>
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock>Default String:</TextBlock>
<TextBlock Text="{Binding Path=DefaultString}" Margin="5,0"/>
</StackPanel>
<Border BorderThickness="3" CornerRadius="3"
BorderBrush="{Binding ElementName=textBox, Path=Text, Converter={StaticResource changedDefaultColorConverter}}">
<TextBox Name="textBox" Text="{Binding Path=DefaultString, Mode=OneTime}"/>
</Border>
</StackPanel>
这里是窗口的代码后端:
public partial class Window11 : Window
{
public static string DefaultString
{
get { return "John Doe"; }
}
public Window11()
{
InitializeComponent();
}
}
最后,这是您使用的转换器:
public class ChangedDefaultColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string text = (string)value;
return (text == Window11.DefaultString) ?
Brushes.Transparent :
Brushes.Yellow;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
即使我在TextBox周围包裹了一个边框(因为我认为这样看起来更好),背景绑定的方式也完全相同:
<TextBox Name="textBox" Text="{Binding Path=DefaultString, Mode=OneTime}"
Background="{Binding ElementName=textBox, Path=Text, Converter={StaticResource changedDefaultColorConverter}}"/>