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}" />