В «реальной жизни» я буду создавать пользовательский элемент управления на основе текстового поля и определять все состояния в Blend, и, возможно, добавлять грязное состояние или что-то подобное и управлять всем этим через логическое свойство.
Тем не менее, вот некоторые доказательства концептуального кода, который, кажется, делает то, что мне нужно. Я думаю, что единственное реальное отличие от того, что вы пытались сделать, это то, что я отслеживаю «старое значение» и сравниваю его, когда текст изменяется, чтобы определить его чистоту. Магический сброс также контролирует это старое значение.
контрольный код:
namespace DirtyTextBox
{
public class DirtyNotifyingTextBox : TextBox
{
public DirtyNotifyingTextBox()
{
this.DefaultStyleKey = typeof(TextBox);
DataContextChanged += DirtyNotifyingTextBox_DataContextChanged;
}
private void DirtyNotifyingTextBox_DataContextChanged(Windows.UI.Xaml.FrameworkElement sender, Windows.UI.Xaml.DataContextChangedEventArgs args)
{
_originalValue = this.Text;
TextChanged += DirtyNotifyingTextBox_TextChanged;
SetToGreen();
}
private string _originalValue { get; set; }
private void DirtyNotifyingTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (this.Text != _originalValue)
{
SetToRed();
}
else
{
SetToGreen();
}
}
private void SetToGreen()
{
this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 50, 205, 0));
}
private void SetToRed()
{
this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 255, 0, 0));
}
public void Reset()
{
Reset(string.Empty);
}
public void Reset(string resetValue)
{
_originalValue = resetValue;
this.Text = resetValue;
}
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
}
}
}
пример использования:
<StackPanel Orientation="Horizontal">
<local:DirtyNotifyingTextBox x:Name="dtextbox" Width="250" Height="50" />
<Button Content="reset" Click="Reset" Margin="10 0" />
<Button Content="reset with value" Click="ResetWithValue" Margin="10 0" />
<Button Content="change text with code" Click="UpdateText" Margin="10 0" />
</StackPanel>
код позади:
private void Reset(object sender, RoutedEventArgs e)
{
dtextbox.Reset();
}
private void ResetWithValue(object sender, RoutedEventArgs e)
{
dtextbox.Reset("Magic Reset");
}
private void UpdateText(object sender, RoutedEventArgs e)
{
dtextbox.Text = "updated text";
}