Триггер против зависимости Предпочтение свойства

63
6

У меня вопрос о достоверности стоимости свойства зависимостей. Мой.xaml выглядит следующим образом:

<Window x:Class="WpfTests.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local ="clr-namespace:WpfTests"
Title="MainWindow" Height="350" Width="525">
<Window.Style>
<Style>
<!--<Setter Property="Canvas.Background" Value="Gray"/>-->
<Style.Triggers>
<Trigger Property="local:MainWindow.IsMouseOver" Value="True">
<!--<Setter Property="local:LeistenPfeil.Symbolfarbe" Value="Red"/>-->
<Setter Property="local:MainWindow.Cursor" Value="Hand" />
<Setter Property="local:MainWindow.BG" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Style>

<Grid Background="{Binding BG,Mode=TwoWay}">
<Button Content="ChangeBG" HorizontalAlignment="Center" VerticalAlignment="Center" Click="OnClick"/>
</Grid>

В моем Codebehind я создал свойство зависимостей "BG" как:

public partial class MainWindow : Window
{
public Brush BG
{
get { return (Brush)GetValue(BGProperty); }
set { SetValue(BGProperty, value); }
}

// Using a DependencyProperty as the backing store for BG. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BGProperty =
DependencyProperty.Register("BG", typeof(Brush), typeof(MainWindow), new PropertyMetadata(Brushes.Black));

public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}

private void OnClick(object sender, RoutedEventArgs e)
{
BG = Brushes.Green;
}
}

Таким образом, при запуске фон установлен на черный (по умолчанию DP). Когда мышь находится над фоном, меняется на синий. Когда дело доходит до изменения BG-свойства в моем коде, триггер работает, но его влияние на фон сетки исчезло. Я уже прочитал эту статью в MSDN: https://msdn.microsoft.com/en-us/library/ms743230%28v=vs.110%29.aspx

Проблема в моем понимании: почему триггер работает, а BG-свойство имеет значение по умолчанию, а не когда оно изменяется в коде? => Самая высокая точность фона - это локальная привязка к сетке, поэтому почему триггер работает вообще?

Как я могу заставить триггер работать снова после изменения свойства BG в коде?

спросил(а) 2021-01-25T19:53:27+03:00 4 месяца, 2 недели назад
1
Решение
62

Изменение кода на самом деле считается локальным изменением. На вашей связанной странице в MSDN:

Локальное значение. Локальное значение может быть установлено с помощью удобства свойства "wrapper", которое также соответствует установке в качестве атрибута или элемента свойства в XAML или вызовом API SetValue с использованием свойства конкретного экземпляра. Если вы устанавливаете локальное значение с помощью привязки или ресурса, каждый из них действует в приоритете, как если бы было задано прямое значение.

Я выделил соответствующую часть, которая гласит, что вызов SetValue как и вы (через свойство BG CLR), приведет к локальному изменению. Поскольку локальное изменение имеет более высокий приоритет, чем Trigger, оно перекрывает значение Trigger.

ответил(а) 2021-01-25T19:53:27+03:00 4 месяца, 2 недели назад
63

Вместо

BG = Brushes.Green;

который устанавливает локальное значение с более высоким приоритетом, чем триггер, вы можете написать

SetCurrentValue(BGProperty, Brushes.Green);

Из MSDN:

... Метод SetCurrentValue изменяет эффективное значение свойства, но существующие триггеры, привязки данных и стили будут продолжать работать.

ответил(а) 2021-01-25T19:53:27+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема