0

(と呼ばれる) の DP (と呼ばれるCurrentItem) の値を変更したときにイベントを発生させて、その DP を変更するように別の人に通知する必要があります。の古い値がターゲット DP で使用されていることを除いて、すべて正常に動作します。DPの新しい値を使用するように強制するにはどうすればよいですか?UserControlMenuButtonUserControlTitleCurrentItemCurrentItem


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"

更新 1:

対話性トリガーを利用する代わりに分離コードを使用することで、回避策を見つけました。(なぜそれが機能するのですか?!)

menuButton.CurrentItemChanged += menuButton_CurrentItemChanged;


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

更新 2:

EventTriggerXAML のみですべてのタスクを実行するために を使用しようとしましたが、インタラクティブ トリガーとまったく同じように動作します。

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

奇妙すぎる!これらのトリガーの動作がイベント ハンドラーと異なるのはなぜですか?

4

1 に答える 1

0

私が他を見落としていなければ、構造体が値渡しされていることが原因である可能性があります。これにより、2 つのコピーが作成されます。1 つはあなたのバインディングで使用され、もう 1 つはオリジナルのものです。これは、バインディングが元ではなくメモリ内にある構造体を更新する場合を意味します。

于 2013-05-09T07:45:40.417 に答える