2013-05-09 4 views
0

Мне нужно поднять событие при изменении значения DP (CurrentItem) UserControl (так называемый MenuButton), чтобы уведомить другого UserControl, чтобы изменить его Title DP. Все работает отлично, кроме старое значение из CurrentItem используется в целевом DP. Как я могу заставить его использовать новое значение для CurrentItem DP?Почему мой RoutedEvent использует старое значение DependencyProperty?


public partial class MenuButton : UserControl 
{ 
    ... 

    public struct ZoneMenuItem 
    { 
     public string MenuTitle 
     { 
      get; 
      set; 
     } 

     public string ZoneTitle 
     { 
      get; 
      set; 
     } 

     public ZoneMenuItem(string menuTitle, string zoneTitle) 
     { 
      this = new ZoneMenuItem(); 

      this.MenuTitle = menuTitle; 
      this.ZoneTitle = zoneTitle; 
     } 
    } 

    #region ________________________________________ CurrentItemChanged RoutedEvent 

    public event RoutedEventHandler CurrentItemChanged 
    { 
     add { AddHandler(CurrentItemChangedEvent, value); } 
     remove { RemoveHandler(CurrentItemChangedEvent, value); } 
    } 

    public static readonly RoutedEvent CurrentItemChangedEvent = 
     EventManager.RegisterRoutedEvent("CurrentItemChanged", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(MenuButton)); 

    #endregion 

    #region ________________________________________ CurrentItem DependencyProperty 

    public ZoneMenuItem CurrentItem 
    { 
     get { return (ZoneMenuItem)GetValue(CurrentItemProperty); } 
     set { SetValue(CurrentItemProperty, value); } 
    } 

    public static readonly DependencyProperty CurrentItemProperty = 
     DependencyProperty.Register("CurrentItem", 
            typeof(ZoneMenuItem), 
            typeof(MenuButton), 
            new FrameworkPropertyMetadata(new ZoneMenuItem(), FrameworkPropertyMetadataOptions.None, OnCurrentItemPropertyChanged)); 

    private static void OnCurrentItemPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     MenuButton instance = sender as MenuButton; 

     if (instance != null) 
     { 
      instance.RaiseEvent(new RoutedEventArgs(MenuButton.CurrentItemChangedEvent)); 
     } 
    } 

    #endregion 
} 

Как было показано выше, я поднял событие на CurrentItem собственности изменилось. Он используется в другом UserControl так:

<i:EventTrigger SourceName="menuButton" EventName="CurrentItemChanged"> 
    <ei:ChangePropertyAction TargetObject="{Binding}" PropertyName="Title"> 
     <ei:ChangePropertyAction.Value> 
      <Binding ElementName="menuButton" Path="CurrentItem.ZoneTitle"/> 
     </ei:ChangePropertyAction.Value> 
    </ei:ChangePropertyAction> 
</i:EventTrigger> 

где

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

Update 1:

Я нашел обходной путь для него с помощью использования кода-за вместо используя триггеры интерактивности. (Почему это работает ?!)

menuButton.CurrentItemChanged += menuButton_CurrentItemChanged; 


private void menuButton_CurrentItemChanged(object sender, RoutedEventArgs e) 
{ 
    this.Title = (sender as MenuButton).CurrentItem.ZoneTitle; 
} 

Update 2:

Я пытался использовать EventTrigger делать все задания только в XAML, но он ведет себя точно так же, как и триггер интерактивности!

<vc:MenuButton x:Name="menuButton" VerticalAlignment="Center" Margin="3,3,0,0"> 
    <vc:MenuButton.Triggers> 
     <EventTrigger SourceName="menuButton" RoutedEvent="vc:MenuButton.CurrentItemChanged"> 
      <BeginStoryboard> 
       <Storyboard> 
        <StringAnimationUsingKeyFrames Storyboard.Target="{Binding}" Storyboard.TargetProperty="Title"> 
         <DiscreteStringKeyFrame KeyTime="0" Value="{Binding ElementName=menuButton, Path=CurrentItem.ZoneTitle}"/> 
        </StringAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </vc:MenuButton.Triggers> 
</vc:MenuButton> 

Это слишком странно! Почему эти триггеры имеют другое поведение, чем обработчик событий?

ответ

0

Если я не забыл про другое, причина может быть вызвана тем, что структуры передаются по значению. Для этого необходимо иметь две копии. Один, который используется вашей привязкой, и другой, который является оригинальным. Это означает, что если ваша привязка обновляет структуру, которая находится в памяти, а не оригинале.

+0

Спасибо @nair, я проверю его на замену структуры классом. ** Редактировать: ** Не работает! – Mimi

+0

Можете ли вы проверить, были ли вы реализованы INotificationPropertyChanged? Например: http: //msdn.microsoft.com/en-us/library/ms743695.aspx – Nair

+0

@nair Это необязательно здесь, так как это свойство [свойство зависимостей] (http://msdn.microsoft.com/ ан-нас/библиотека/ms752914.aspx). Кроме того, уведомление об изменении, по-видимому, работает: обработчик свойства изменен, когда возникает RoutedEvent. – Clemens

Смежные вопросы