У меня есть UserControl, который существует только из двух текстовых блоков:
<UserControl [...] x:Name="root">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Text1, ElementName=root}" />
<TextBlock Text="{Binding Text2, ElementName=root}" />
</StackPanel>
</UserControl>
Соответствующий код выглядит следующим образом:
public static readonly DependencyProperty Text1Property = DependencyProperty.Register("Text1", typeof(String), typeof(CmpText));
public static readonly DependencyProperty Text2Property = DependencyProperty.Register("Text2", typeof(String), typeof(CmpText));
public string Text1
{
get { return (string)GetValue(Text1Property); }
set { SetValue(Text1Property, value); }
}
public string Text2
{
get { return (string)GetValue(Text2Property); }
set { SetValue(Text2Property, value); }
}
И вот как я использую этот UserControl в MainWindow.xml:
<local:CmpText Text1="{Binding Password1}" Text2="{Binding Password2}" />
Что мне в основном нужно, так это чтобы фон второго TextBlock изменил свой цвет на красный, если и Text1, и Text2 неравны.
Я пытался использовать вспомогательное свойство в коде:
public bool IsEqual { get { return Text1 == Text2; } }
И установить стиль второго текстового блока на
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsEqual, ElementName=root}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
Однако IsEqual всегда оказывается «истиной» (а фон TextBlock всегда красный), даже если свойства Text1 и Text2 не совпадают. Я думаю, что мое вспомогательное свойство 'IsEqual' сравнивает значения по умолчанию Text1 & Text2, которые оказываются NULL (у меня нет никакого способа подтвердить это, так как я не могу отладить GUI). Таким образом, оценка IsEqual, кажется, происходит до того, как моим свойствам текста будут присвоены какие-либо значения. Я хочу, чтобы оценка произошла после свойств текста.
Я не знаю, как поступить. Вы можете помочь?