Вам нужно будет использовать преобразователь значений (преобразование ввода строки в вывод цвета), и самое простое решение заключается в добавлении как минимум еще одного свойства в 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}}"/>