2013-03-23 34 views
6

TreeView内の項目を検索できるようにします。 検索テキストを入力した後、TreeViewItemをスクロールして表示する必要があります。MVViewを使用したTreeView BringIntoView

今私はTreeViewItemsとMainViewのMVViewをTreeViewに使用しています。

MVVMを利用したBringIntoViewの機能を取得するにはどうすればよいですか? バインドできるプロパティはありますか? (MFCの中にFirstVisibileItemのようなものがありました)

"解決策"を見たことがあります。本当に必要ですか?

+0

:-)楽しみを持って、私はMVVMは "選択" の概念で停止すべきだと思います。それがアイテムをビューにスクロールしない場合は、ビューで定期的なイベントを使用します。 –

+1

あなたはそうです、ビューモデルはビューを気にしてはいけません。しかし、ここに私が信じているMVVMの "境界"にある特別なケースがあります。 –

+0

VMは特定の項目を示すはずですが、それだけです。スクロールの問題は、ビューでよりよく処理されます。 –

答えて

5

問題はBehaviorで解決できます。

このCodeProject articleは非常によく説明しており、そのまま出荷されます。

8

上記のコードプロジェクトの記事では、Behaviorを設定する方法とXAMLでBehaviorを統合する方法を示すコード例を示します。

セットアップ行動:

/// <summary> 
/// Exposes attached behaviors that can be 
/// applied to TreeViewItem objects. 
/// </summary> 
public static class TreeViewItemBehavior 
{ 
    #region IsBroughtIntoViewWhenSelected 
    public static bool GetIsBroughtIntoViewWhenSelected(TreeViewItem treeViewItem) 
    { 
     return (bool)treeViewItem.GetValue(IsBroughtIntoViewWhenSelectedProperty); 
    } 

    public static void SetIsBroughtIntoViewWhenSelected(  TreeViewItem treeViewItem, bool value) 
    { 
     treeViewItem.SetValue(IsBroughtIntoViewWhenSelectedProperty, value); 
    } 

    public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty = 
    DependencyProperty.RegisterAttached(
    "IsBroughtIntoViewWhenSelected", 
    typeof(bool), 
    typeof(TreeViewItemBehavior), 
    new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged)); 

    static void OnIsBroughtIntoViewWhenSelectedChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
    { 
     TreeViewItem item = depObj as TreeViewItem; 
     if (item == null) 
      return; 

     if (e.NewValue is bool == false) 
      return; 

     if ((bool)e.NewValue) 
      item.Selected += OnTreeViewItemSelected; 
     else 
      item.Selected -= OnTreeViewItemSelected; 
    } 

    static void OnTreeViewItemSelected(object sender, RoutedEventArgs e) 
    { 
     // Only react to the Selected event raised by the TreeViewItem 
     // whose IsSelected property was modified. Ignore all ancestors 
     // who are merely reporting that a descendant's Selected fired. 
     if (!Object.ReferenceEquals(sender, e.OriginalSource)) 
     return; 

     TreeViewItem item = e.OriginalSource as TreeViewItem; 
     if (item != null) 
      item.BringIntoView(); 
    } 

    #endregion // IsBroughtIntoViewWhenSelected 
} 

次にXAMLでTreeViewItemBehaviorを統合:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="local:TreeViewItemBehavior.IsBroughtIntoViewWhenSelected" Value="True"/> 
    </Style> 
</TreeView.ItemContainerStyle> 

+0

依存関係プロパティの設定は、私のツリービュー内の項目に適用されていませんそれらを拡大することによって目に見えるようになるまで。したがって、TreeViewItem.Selectedには最初にイベントが添付されていません。プログラムでノードを展開し、ツリー内の深さを1つ選択するコードがある場合、そのコードは表示されません。 – DannyMeister

+0

私の特定のケースの解決策が見つかりました。依存関係プロパティが有効になっている場合は、アイテムが既に選択されている場合は、そのアイテムにスクロールしてスクロールすることが理にかなっています。 ifの中で、行の後に: 'item.Selected + = OnTreeViewItemSelected;'を追加しました: 'if(item.IsSelected){item.RaiseEvent(new RoutedEventArgs(TreeViewItem.SelectedEvent)); } ' – DannyMeister

+0

これは動作ではなく、拡張機能です。 TreeViewItem *ビヘイビアー* – Snicker

関連する問題