WPF изменить фон элемента управления с прикрепленным свойством

Мне нужно изменить фон меток и кнопок, когда логическая переменная имеет значение true (вернуться к цвету по умолчанию на false). поэтому я написал прикрепленное свойство. пока это выглядит так:

public class BackgroundChanger : DependencyObject
{
    #region dependency properties
    // status
    public static bool GetStatus(DependencyObject obj)
    {
        return (bool)obj.GetValue(StatusProperty);
    }
    public static void SetStatus(DependencyObject obj, bool value)
    {
        obj.SetValue(StatusProperty, value);
    }
    public static readonly DependencyProperty StatusProperty = DependencyProperty.RegisterAttached("Status",
                     typeof(bool), typeof(BackgroundChanger), new UIPropertyMetadata(false, OnStatusChange));

    #endregion

    private static void OnStatusChange(DependencyObject obj,  DependencyPropertyChangedEventArgs e) 
    {
        var element = obj as Control;
        if (element != null)
        {
            if ((bool)e.NewValue)
                element.Background = Brushes.LimeGreen;
            else
                element.Background = default(Brush);
        }
    }
}

и я использую это так:

<Label CustomControls:BackgroundChanger.Status="{Binding test}" />

это работает отлично. когда соответствующая переменная test установлен в viewmodel, цвет фона меняется на LimeGreen,

мой вопрос:

цвет LimeGreen жестко закодировано. Я хотел бы установить этот цвет (и цвет по умолчанию) в XAML. так что я могу решить, между какими двумя цветами фон переключается. Как я могу это сделать?

2 ответа

Решение

Вы можете иметь несколько прикрепленных свойств. Доступ к ним прост, есть статические Get.. а также Set.. методы, к которым вы поставляете DependencyObject какое значение свойства вы хотите использовать.

public class BackgroundChanger : DependencyObject
{
    // make property Brush Background
    // type "propdp", press "tab" and complete filling

    private static void OnStatusChange(DependencyObject obj,  DependencyPropertyChangedEventArgs e) 
    {
        var element = obj as Control;
        if (element != null)
        {
            if ((bool)e.NewValue)
                element.Background = GetBrush(obj); // getting another attached property value
            else
                element.Background = default(Brush);
        }
    }
}

В xaml это будет выглядеть так

<Label CustomControls:BackgroundChanger.Status="{Binding test}"
    CustomControls:BackgroundChanger.Background="Red"/>

Почему бы вместо этого не использовать DataTrigger?

<Style x:Key="FilePathStyle" TargetType="TextBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=AddButton, Path=IsEnabled}" Value="True">
            <Setter Property="Background" Value="#FFEBF7E1" />
        </DataTrigger>

        <DataTrigger Binding="{Binding ElementName=AddButton, Path=IsEnabled}" Value="False">
            <Setter Property="Background" Value="LightYellow" />
        </DataTrigger>
    </Style.Triggers>
</Style>

.
.
.
<TextBox Style="{StaticResource FilePathStyle}" x:Name="filePathControl" Width="300" Height="25" Margin="5" Text="{Binding SelectedFilePath}" />
Другие вопросы по тегам