2013-05-09 19 views
0

我需要提出更改UserControl(稱爲MenuButton)的DP(稱爲CurrentItem)值的事件以通知另一個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屬性改變引發的事件。它在另一個用戶控件使用像這樣:

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

更新1:

我通過使用代碼隱藏,而不是找到了一個解決方法是利用交互觸發。 (爲什麼它的工作?!)

menuButton.CurrentItemChanged += menuButton_CurrentItemChanged; 


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

更新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,我會測試它用一個類替換struct。 **編輯:**不起作用! – Mimi 2013-05-09 07:48:48

+0

你可以檢查你是否實現了INotificationPropertyChanged?例如:http://msdn.microsoft.com/en-us/library/ms743695.aspx – Nair 2013-05-09 08:24:00

+0

@nair這不是必要的,因爲該屬性是[依賴屬性](http://msdn.microsoft.com/ EN-US /庫/ ms752914.aspx)。此外,更改通知顯然是有效的:屬性更改處理程序是RoutedEvent引發的地方。 – Clemens 2013-05-09 08:27:16

相關問題