TreeView BringIntoView with MVVM

本文关键字:MVVM with BringIntoView TreeView | 更新日期: 2023-09-27 18:05:21

我希望用户能够在TreeView中搜索项目。在输入搜索文本后,TreeViewItem应该滚动到视图中。

现在我正在使用MVVM模式的TreeView,为TreeViewItems和主视图。

我要做什么才能利用MVVM获得BringIntoView的功能?有什么属性可以绑定吗?(在MFC中有类似FirstVisibileItem的东西)

看到一个行为的"解决方案"。真的有必要吗?

TreeView BringIntoView with MVVM

根据前面提到的代码项目文章,下面是代码示例,展示了如何设置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>

玩得开心点:-)

这个问题可以通过行为来解决。

这篇CodeProject文章非常好地描述了它,并且它开箱即用。