Вот пример коллекции "join" * Актеры и фильмы:
https://github.com/mongodb/cookbook/blob/master/ content / patterns / pivot.txt
Использует метод .mapReduce()
* join - альтернативу объединению в документарно-ориентированных базах данных
Ответ очень прост: используйте логический флаг, чтобы различать, когда запускать «красный флаг», а когда зеленый.
В «реальной жизни» я создавал бы пользовательский элемент управления на основе текстового поля и определял все состояния в 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";
}