ForcingPropertyChangedCallback DP для стрельбы

Мой вопрос может звучать немного похожим на этот вопрос

У меня есть панель уведомлений, которая подвергается определенным анимациям при изменении свойства DependencyProperty моего пользовательского элемента управления UserControl. Здесь идет реализация кода:

    public string StatusBarText
    {
      get { return (string)GetValue(StatusBarTextProperty); }
      set { SetValue(StatusBarTextProperty, value); }
    }

   public static readonly DependencyProperty StatusBarTextProperty =
        DependencyProperty.Register("StatusBarText", typeof(string), typeof(WorkspaceFrame), new FrameworkPropertyMetadata(null, StatusBarTextChangedCallBack));

    private static void StatusBarTextChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      if (!string.IsNullOrWhiteSpace(Convert.ToString(e.NewValue)))
      {
        var workspaceFrame = d as WorkspaceFrame;
        if (null == workspaceFrame)
          return;
        var storyboard = workspaceFrame.FindResource("notificationBarAnimation") as Storyboard;
        if (null == storyboard)
          return;
        var statusBar = workspaceFrame.Template.FindName("PART_StatusBar", workspaceFrame) as Border;
        if (null == statusBar)
          return;
        //Run the animation
        storyboard.Begin(statusBar);
      }
    }

и вот граница, которая становится анимированной:

<Border x:Name="PART_StatusBar" Margin="5" BorderThickness="2" VerticalAlignment="Top"
                    DataContext="{Binding Path=StatusText}" Opacity="0"
                    Visibility="{Binding Path=Opacity, Mode=OneWay, RelativeSource={RelativeSource Self}, Converter={StaticResource doubleToVis}}"
                    BorderBrush="{StaticResource StatusMessageBackBrush}">

                <Border.Background>
                  <SolidColorBrush Color="{StaticResource StatusMessageBackColor}" Opacity="0.7"/>
                </Border.Background>

                <TextBlock Margin="10" FontSize="17" Foreground="{StaticResource BlackColorBrush}" Text="{Binding}">

                </TextBlock>
              </Border>

Как вам сейчас может быть понятно, этот DP связан со свойством VM, которое запускает PropertyChangedNotification (из INotifyProeprtyChanged), когда установлено. Теперь проблема в том, что StatusBarTextChangedCallBack вызывается, только если есть некоторые изменения в старом и новом значении DP. Есть ли способ заставить его работать? Если нет, есть ли способ обойти? Мне нужно показывать одно и то же уведомление снова и снова. И анимация должна срабатывать.

С уважением,

Джеймс

2 ответа

Решение

Вы можете зарегистрировать CoerceValueCallBack функция вместо ValueChanged. Что-то вроде этого:

public static readonly DependencyProperty StatusBarTextProperty =
        DependencyProperty.Register("StatusBarText", typeof(string), typeof(WorkspaceFrame), new FrameworkPropertyMetadata(null,null, StatusBarTextCoerceValueCallBack));



private static object StatusBarTextCoerceValueCallBack(DependencyObject d, object value)
{

 }

CoerceValueCallback всегда будет запускаться, когда значение свойства изменяется, даже если значение одинаково.

Спасибо

Обычный способ достичь желаемого (или вызвать обработчик событий вручную) - создать метод для запуска анимации. Затем вызовите этот метод запуска анимации из вашего обработчика измененного свойства. Таким образом, вы можете просто вызвать этот метод, когда вам нужно.

Другие вопросы по тегам