Мне нужно поднять событие при изменении значения 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>
Это слишком странно! Почему эти триггеры имеют другое поведение, чем обработчик событий?
Спасибо @nair, я проверю его на замену структуры классом. ** Редактировать: ** Не работает! – Mimi
Можете ли вы проверить, были ли вы реализованы INotificationPropertyChanged? Например: http: //msdn.microsoft.com/en-us/library/ms743695.aspx – Nair
@nair Это необязательно здесь, так как это свойство [свойство зависимостей] (http://msdn.microsoft.com/ ан-нас/библиотека/ms752914.aspx). Кроме того, уведомление об изменении, по-видимому, работает: обработчик свойства изменен, когда возникает RoutedEvent. – Clemens