Итак, я создаю приложение WPF, используя шаблон проектирования MV-VM, и у меня возникают проблемы с правильной работой моих привязок.
У меня есть собственный ToggleButton, и я хочу, чтобы он работал так:
- Когда для свойства IsChecked элемента управления установлено значение true, тогда он должен запрашивать второе логическое значение (содержащееся в ViewModel), которое также имеет значение true.
- Если это так, установите цвет фона на один цвет, если нет, установите его на другой цвет.
- Если IsChecked имеет значение false, используйте стандартный цвет.
В xaml у меня есть этот стиль:
<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource CustomisableToggleButton}" x:Key="ValidatedTButton">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsChecked}" Value="True" />
<Condition Binding="{Binding IsValid}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Turquoise" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsChecked}" Value="True" />
<Condition Binding="{Binding IsValid}" Value="False" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="LightCoral" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<DataTrigger Binding="{Binding IsChecked}" Value="False">
<Setter Property="Background" Value="AliceBlue" />
</DataTrigger>
</Style.Triggers>
</Style>
(CustomisableToggleButton - это универсальный стиль, который применяется к ToggleButtons - AFAIK, это должно переопределять присущие ему триггеры - поправьте меня, если я ошибаюсь)
В классе управления:
public class ValidatedToggleButton : ToggleButton
{
public ValidatedToggleButton()
: base() { }
public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register(
"IsValid", typeof(bool), typeof(ValidatedToggleButton));
public bool IsValid
{
get { return (bool)GetValue(IsValidProperty); }
set { SetValue(IsValidProperty, value); }
}
}
И фактическая реализация элемента управления:
<Window
<!--standard window properties-->
xmlns:cc="clr-namespace:MVVM.CustomControls"> // namespace where 'ValidatedToggleButton' resides
<!--other XAML code-->
<cc:ValidatedToggleButton
IsValid="{Binding Boolean1}"
Content="ToggleButton1"
IsChecked="{Binding ToggleButton1Checked}"
Grid.Row="6" Style="{StaticResource ValidatedTButton}" />
</Window>
Теперь проблема в том, что он никогда не проверяет значение «Boolean1», кроме одного раза при запуске (проверено с помощью точек останова). Как я могу заставить его проверять это значение каждый раз, когда нажимается элемент управления?