изменить цвет границы флажка Material WPF на основе DataTrigger - PullRequest
1 голос
/ 07 апреля 2020

Чтобы изменить цвет границы флажка Wpf-Material, необходимо переопределить его ресурс следующим образом :

<Style TargetType="Checkbox" BasedOn="{StaticResource MaterialDesignCheckBox}">
    <Style.Resources>
        <SolidColorBrush x:Key="MaterialDesignCheckBoxOff" Color="Red" />
    </Style.Resources>
</Style>

Это работает, и границы флажков становятся красными. С флажками материала это: <Setter Property="BorderBrush" Value="Red" /> не работает.

Проблема в том, что я пытаюсь применить это свойство границы динамически. Поэтому я создал пользовательский компонент для флажка, в который я добавил логический DependencyProperty с именем IsDirty. Если IsDirty == true и флажок IsChecked, то я меняю фон (это работает хорошо). Если IsDirty == true и флажок не IsChecked, я бы хотел изменить цвет границы (так как фон прозрачный) в этом случае. Я попробовал что-то, как указано ниже:

<Style TargetType="{x:Type local:CustomCheckbox}" x:Key="dirtyCustomCheckbox" BasedOn="{StaticResource MaterialDesignCheckBox}">
    <Style.Resources>
        <SolidColorBrush x:Key="MaterialDesignCheckBoxOff" Color="Red" />
    </Style.Resources>
</Style>

<Style TargetType="{x:Type local:CustomCheckbox}" BasedOn="{StaticResource MaterialDesignCheckBox}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
                <Setter Property="Background" Value="Red" />
            </MultiDataTrigger.Setters>
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="False" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
                <Setter Property="Style" Value="{StaticResource dirtyCustomCheckbox}" />
            </MultiDataTrigger.Setters>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

Но я получаю следующее исключение: ArgumentException: объекту Style не разрешается влиять на свойство Style объекта, к которому он применяется.

Любая другая идея о том, как я могу этого добиться?

1 Ответ

1 голос
/ 07 апреля 2020

Есть еще идеи, как мне этого добиться?

Вы можете добавить ресурс, который привязывается к свойству Tag в конструкторе пользовательского элемента управления:

public CustomCheckbox()
{
    var brush = new SolidColorBrush();
    BindingOperations.SetBinding(brush, SolidColorBrush.ColorProperty, new Binding(nameof(Tag)) { Source = this, Mode = BindingMode.TwoWay });
    Resources.Add("MaterialDesignCheckBoxOff", brush);
}

Затем вы просто устанавливаете свойство Tag в Style:

<Style TargetType="{x:Type local:CustomCheckbox}"
       BasedOn="{StaticResource MaterialDesignCheckBox}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
                <Setter Property="Background" Value="Red" />
            </MultiDataTrigger.Setters>
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="False" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
                <Setter Property="Tag" Value="Red" />
            </MultiDataTrigger.Setters>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>
...