Caliburn.Microは、Behaviorのイベントでイベントハンドラーをアタッチします

zrkl

スワイプジェスチャを処理してListViewのItemTemplateに配置するために、独自のビヘイビアを作成しました。スワイプが完了すると、LeftSwipeまたはRightSwipeのイベントが発生します。このイベントは、私のViewModelによって処理される必要があります。

Caliburn.Microの構文を使用して、ハンドラーをイベントにアタッチしますcm:Message.Attach="[Event LeftSwipe] = [LeftSwipe($source, $eventArgs)"

これが私の行動です:

public class SwipeInteractionBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(DependencyObject associatedObject)
    {
        // ...
    }

    public void Detach()
    {
        // ...
    }

    public event EventHandler LeftSwipe;

    public event EventHandler RightSwipe;

    // ...
    // ...

    private void OnLeftSwipe(FrameworkElement element)
    {
        // ...

        if (LeftSwipe != null)
        {
            LeftSwipe(this, EventArgs.Empty);
        }
    }

    private void OnRightSwipe(FrameworkElement element)
    {
        // ...
        if (RightSwipe != null)
        {
            RightSwipe(this, EventArgs.Empty);
        }

    }
}

これは、ListViewsItemTemplate内でこの動作を使用する方法です。

        <ListView x:Name="Links" IsItemClickEnabled="True" SelectionMode="None" cm:Message.Attach="[Event ItemClick] = [Click($source, $eventArgs)]">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid>
                            <Border x:Name="todoItem" Loaded="Border_Loaded" Background="White">
                                <i:Interaction.Behaviors>
                                    <local:SwipeInteractionBehavior cm:Message.Attach="[Event LeftSwipe] = [LeftSwipe($source, $eventArgs)]" />
                                </i:Interaction.Behaviors>

                                <Grid>
                                    <StackPanel>
                                        <TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemContentTextBlockStyle}" />
                                        <TextBlock Text="{Binding Url}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
                                        <TextBlock Text="{Binding Tags, Converter={StaticResource ListToString}}" />
                                    </StackPanel>
                                </Grid>
                            </Border>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

LeftSwipeイベントを発生させた場合、例外が発生しました。これが私のStackTraceです。

System.Exception was not handled.
  HResult=-2146233088
  Message=No target found for method LeftSwipe.
  Source=Caliburn.Micro.Platform
  StackTrace:
       at Caliburn.Micro.ActionMessage.Invoke(Object eventArgs)
       at Caliburn.Micro.TriggerAction`1.Execute(Object sender, Object parameter)
       at Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(Object sender, ActionCollection actions, Object parameter)
       at Microsoft.Xaml.Interactions.Core.EventTriggerBehavior.OnEvent(Object sender, Object eventArgs)
       at ReaderApp.SwipeInteractionBehavior.<>c__DisplayClass5.<OnLeftSwipe>b__4()
       at ReaderApp.Extensions.FrameworkElementExtension.<>c__DisplayClass2.<Animate>b__0(Object s, Object e)
  InnerException: 

ViewModel:

public class MainViewModel : ViewModelBase
{
    private readonly IEventAggregator eventAggregator;
    private readonly Database database;

    public BindableCollection<Link> Links
    {
        get;
        private set;
    }

    public MainViewModel(INavigationService navigationService, IEventAggregator eventAggregator, Database database)
        : base(navigationService)
    {
        this.eventAggregator = eventAggregator;
        this.database = database;

        Links = new BindableCollection<Link>();
    }

    public async void LeftSwipe(object sender, EventArgs e)
    {
        // ...
    }

    public void RightSwipe(object sender, EventArgs e)
    {
        // ...
    }
}
ナイジェルサンプソン

したがって、問題はActionMessage継承TriggerAction<FrameworkElement>することSwipeInteractionBehaviorです。つまり、に正しく接続できません

また、WPF / Silverlight / Windows Phone8インタラクティブSDKとWinRTインタラクティブSDKの間にいくつかの主要なAPIの違いがあるという事実によって複雑になっています。パーサーのコメントで私が言っていることを少し見ることができます。

私がお勧めするのはSwipeInteractionBehaviorトリガービヘイビアとして実装することですEventTriggerBehavior。これは以前は別の基本クラスでしたが、WinRTではまだですIBehaviorが、違いは、タイプのアクションと呼ばれるプロパティがあることActionCollectionです。愚かなことに、これを強制する基本クラスのインターフェースがないため、Caliburn.Microはいくつかの仮定を立てて立ち往生しています。

次にInteraction.ExecuteActions、これらのアクションをトリガーするために使用します。最終的に、xamlは次のようになります。

<Border x:Name="SwipeTarget">
  <i:Interaction.Behaviors>
    <local:SwipeEventBehavior Direction="Left">
      <cm:ActionMessage AssociatedObject="{Binding ElementName=SwipeTarget" Method="LeftSwipe" />
    </local:SwipeEventBehavior>
  </i:Interaction.Behaviors>
</Border>

少し時間がかかりますが、SDKの変更によって課せられる制限を回避する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

WPF + Caliburn Micro:ウィンドウを閉じるイベントをキャッチする方法は?

分類Dev

PublishOnUIThreadAsyncをラップするメソッドのCaliburnイベントアグリゲーターを使用してmoqをセットアップします

分類Dev

Caliburn.Microで複数のイベントに添付する

分類Dev

Caliburn Micro MVVM INotifyPropertyChange

分類Dev

Caliburn.microはBindableCollectionアイテムを「時々」バインドします

分類Dev

WPFリボン流暢:DropDownButton + Caliburn.Microイベント

分類Dev

Caliburn.Microを使用したMVVMWPFでのバインド

分類Dev

Caliburn.MicroのUserControl

分類Dev

MVVM Caliburn.Microでユーザーコントロールをバインドする方法は?

分類Dev

ValueConverterをコンベンションベースのCaliburn.Microバインディングの例にどのように適用しますか?

分類Dev

UWP、Caliburn.Micro:メソッドシングルトンのコンストラクターのパラメーターを渡す方法は?

分類Dev

Caliburn.Micro and app resume

分類Dev

ItemsControl内のComboBoxをCaliburn.Microでバインドする方法は?

分類Dev

Caliburn.Micro-ValueTupleのObservableCollectionをComboBoxにバインドする

分類Dev

Caliburn.Microクリックイベント画像ポイントを見つけて距離を計算するには

分類Dev

Caliburn.MicroのボタンクリックでComboBoxにアイテムが追加されます

分類Dev

UserControlをViewModelにバインドする(Caliburn Micro WPF)

分類Dev

Caliburn.microdatagrid削除ボタン

分類Dev

UWPでCaliburn.Microを使用したコンストラクターからの非同期メソッド呼び出し

分類Dev

Caliburn.Micro書き方は?

分類Dev

Caliburn.Micro.Contrib GenericDialogBoxの使用

分類Dev

Caliburn.Micro動的MenuItemを追加

分類Dev

ComboBoxでのCaliburn.Micro列挙型バインディング

分類Dev

WPF-パラメーターとしてコントロールを備えたCaliburnマイクロイベントトリガー

分類Dev

リストボックスバインディング(Caliburn.Micro)-トラブルシューティング

分類Dev

Caliburn.Microとコントローラー?

分類Dev

How to use NotifyOfPropertyChange in static property (Caliburn Micro)

分類Dev

Passing argument to method in XAML with Caliburn Micro [WPF]

分類Dev

Caliburn Micro event on view/viewmodel closing

Related 関連記事

  1. 1

    WPF + Caliburn Micro:ウィンドウを閉じるイベントをキャッチする方法は?

  2. 2

    PublishOnUIThreadAsyncをラップするメソッドのCaliburnイベントアグリゲーターを使用してmoqをセットアップします

  3. 3

    Caliburn.Microで複数のイベントに添付する

  4. 4

    Caliburn Micro MVVM INotifyPropertyChange

  5. 5

    Caliburn.microはBindableCollectionアイテムを「時々」バインドします

  6. 6

    WPFリボン流暢:DropDownButton + Caliburn.Microイベント

  7. 7

    Caliburn.Microを使用したMVVMWPFでのバインド

  8. 8

    Caliburn.MicroのUserControl

  9. 9

    MVVM Caliburn.Microでユーザーコントロールをバインドする方法は?

  10. 10

    ValueConverterをコンベンションベースのCaliburn.Microバインディングの例にどのように適用しますか?

  11. 11

    UWP、Caliburn.Micro:メソッドシングルトンのコンストラクターのパラメーターを渡す方法は?

  12. 12

    Caliburn.Micro and app resume

  13. 13

    ItemsControl内のComboBoxをCaliburn.Microでバインドする方法は?

  14. 14

    Caliburn.Micro-ValueTupleのObservableCollectionをComboBoxにバインドする

  15. 15

    Caliburn.Microクリックイベント画像ポイントを見つけて距離を計算するには

  16. 16

    Caliburn.MicroのボタンクリックでComboBoxにアイテムが追加されます

  17. 17

    UserControlをViewModelにバインドする(Caliburn Micro WPF)

  18. 18

    Caliburn.microdatagrid削除ボタン

  19. 19

    UWPでCaliburn.Microを使用したコンストラクターからの非同期メソッド呼び出し

  20. 20

    Caliburn.Micro書き方は?

  21. 21

    Caliburn.Micro.Contrib GenericDialogBoxの使用

  22. 22

    Caliburn.Micro動的MenuItemを追加

  23. 23

    ComboBoxでのCaliburn.Micro列挙型バインディング

  24. 24

    WPF-パラメーターとしてコントロールを備えたCaliburnマイクロイベントトリガー

  25. 25

    リストボックスバインディング(Caliburn.Micro)-トラブルシューティング

  26. 26

    Caliburn.Microとコントローラー?

  27. 27

    How to use NotifyOfPropertyChange in static property (Caliburn Micro)

  28. 28

    Passing argument to method in XAML with Caliburn Micro [WPF]

  29. 29

    Caliburn Micro event on view/viewmodel closing

ホットタグ

アーカイブ