您将需要使用值转换器(将字符串输入转换为颜色输出),最简单的解决方案包括向 EmployeeViewModel 添加至少一个属性。您需要创建某种Default或OriginalValue属性,并与之进行比较。否则,你怎么知道“原始值”是什么?您无法判断该值是否已更改,除非有一些东西持有原始值进行比较。
因此,绑定到 text 属性并将输入字符串与视图模型上的原始值进行比较。如果已更改,请返回突出显示的背景颜色。如果匹配,则返回正常的背景颜色。如果要从单个文本框中比较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>
这是 Window 的代码隐藏:
/// <summary>
/// Interaction logic for Window11.xaml
/// </summary>
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}}"/>