0

ルーティング イベントが登録された UserControl があります。

    public static readonly RoutedEvent OnVisualChartRangeChangedEvent =
    EventManager.RegisterRoutedEvent("OnVisualChartRangeChanged",
    RoutingStrategy.Bubble, typeof(OnScrollChangedHandler), typeof(ChartBehavior));

    public event OnScrollChangedHandler OnVisualChartRangeChanged
    {
        add { AssociatedObject.AddHandler(OnVisualChartRangeChangedEvent, value); }
        remove { AssociatedObject.RemoveHandler(OnVisualChartRangeChangedEvent, value); }
    }

次のように、ユーザー コントロールからこのルーティング イベントを発生させます。

    protected virtual void OnScrollEvent(object oldValue, object newValue)
    {

        AssociatedObject.RaiseEvent(new DateTimeEventArgs(OnVisualChartRangeChangedEvent, minDate, maxDate));
    }

このユーザーコントロールをメインビュー内に次のように埋め込みます。

    Title="MainWindow" Height="350" Width="525">
<Grid>      
    <historicChart:HistoricChartControl></historicChart:HistoricChartControl>
</Grid>

このイベントが発生したときに Viewmodel からメソッドを呼び出して、カスタム ルーティング イベントを処理したいと考えています。

私は最初にこれを試しました:

<Grid>
    <historicChart:HistoricChartControl behaviours:ChartBehavior.OnVisualChartRangeChanged="VisualChartRangeChanged"/>
</Grid>

ただし、ハンドラー メソッド (VisualChartRangeChanged) が Viewmodel ではなく View に配置されるため、MVVM に逆らう必要があります。

次に、これを試しました:

    Title="MainWindow" Height="350" Width="525">
<Grid>
    <!--behaviours:ChartBehavior.OnVisualChartRangeChanged="RoutedEventHandler"-->
    <historicChart:HistoricChartControl>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="OnVisualChartRangeChanged">
                <ei:CallMethodAction TargetObject="{Binding}" MethodName="MyMethod"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </historicChart:HistoricChartControl>
</Grid>

しかし、イベント ハンドラー メソッド (MyMethod) は呼び出されていません。

誰かがこれがどのように行われるかの例を提供できますか?

ありがとう。


編集済み

そこで、次のようにコードを修正しました。

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="{x:Static behaviours:ChartBehavior.OnVisualChartRangeChangedEvent}">
                <ei:CallMethodAction TargetObject="{Binding}" MethodName="MyMethod"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

これを見るだけでなく、http://i.stack.imgur.com/xR9DY.jpg

しかし、表示された通知にもかかわらずコンパイルされても、次の内部例外が発生します。

{"'ChartBehavior.OnVisualChartRangeChanged' は、プロパティ 'EventName' の有効な値ではありません。"}

メイン ビューのビューモデルでハンドラー メソッドを呼び出して、ユーザー コントロールからルーティング イベントを処理するためのより良い方法はありますか?

4

1 に答える 1

0

他の同じ質問に対する回答を既に投稿しました。イベント名がリンクで文字列として指定され、x:Static を使用していないことに注意してください。

ViewModel 内から UserControl から起動されたカスタム RoutedEvent を処理する方法を教えてください 。

そして、ここにリンクCustom RoutedEvent as EventTrigger があります

だからこれをしてください:

<EventTrigger RoutedEvent="behaviours:ChartBehavior.OnVisualChartRangeChanged">

最後に、コード ビハインド ハンドラー内から ViewModel ハンドラーを呼び出すことに何の問題もないことを付け加えたいと思います。複雑にしないでおく。

于 2013-12-01T22:33:09.133 に答える