6

私は WPF/MVVM アプリケーションを開発しており、ViewModel のデータにリストボックスをバインドしています。さまざまな時点で、リストボックスを特定の要素にスクロールさせるビューモデルが必要です。

カスタム コントロールを作成せずに、懸念事項の適切な分離を維持しながら、これを行うにはどうすればよいでしょうか?

私は現在VisibleIndex、XAMLコードがビューモデルの整数にバインドする依存関係プロパティを使用して、ビューレイヤーにカスタム動作クラスを作成することで機能しています:

<ListBox x:Name="myListBox" 
        local:ListBoxVisibilityBehavior.VisibleIndex="{Binding VisibleIndex}">

整数が設定されると、依存関係プロパティの更新ハンドラーがトリガーされ、リストボックスに関連するインデックスまでスクロールするように指示されます。

依存関係プロパティの値がリストボックスによって変更されることはなく、値が変更されたときにのみ更新ハンドラーが呼び出されるため、これは少しハックに思えます。したがって、関連項目が確実に表示されるようにする唯一の方法は、次のようにすることです。

// view-model code
this.VisibleIndex = -1;
this.VisibleIndex = 10;

現時点で動作クラスを使用している唯一の理由は、カスタム依存関係プロパティをバインドするためです。代わりにイベントでこのようなことを行う方法はありますか?

4

2 に答える 2

0

あなたの場合、添付プロパティが多少必要です-ある時点で、「どこか」で次のメソッドを呼び出す必要があります...

ListBox.ScrollIntoView(item)  

また

ListBoxItem.BringIntoView();

そのためには、ある種のコードビハインドが必要です。添付の​​プロパティ/動作は、MVVM に影響を与えずにパッケージ化するための優れた方法です。

そうは言っても、「選択したアイテム」を常にスクロールして表示する必要がある場合(ほとんどの場合)。次に、別の添付プロパティベースのソリューションを使用できます(これも):

mvvm リスト ビュー内の新しいアイテムにリスト ビューを自動スクロールする方法

あとは、 を設定またはバインドするだけSelectedItemです。

あなたが望むなら、それは少し「より良い」ですが、メカニズムは同じです.

于 2013-04-22T16:03:20.953 に答える
0

WPF フォーラムの MS エンジニアのこの 1 人への回答に興味がある人は、それを解決してくれました。イベントに直接バインドする代わりに、そのイベントをカプセル化するラッパー オブジェクトにバインドします。その後、ビヘイビアーは DP からラッパーへの参照を取得し、必要なことを実行できます。つまり、イベントのサブスクライブ、トリガーなどです。

于 2013-05-03T05:23:14.627 に答える