Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Treeview是否仅展开第一个节点和选定项?_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

C# WPF Treeview是否仅展开第一个节点和选定项?

C# WPF Treeview是否仅展开第一个节点和选定项?,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我在WPF中使用treeview,我不想在重新加载绑定的集合时丢失状态(扩展和焦点) 在第一次加载时,很容易仅扩展第一个节点,我使用以下代码: private void ExpandFirstNodeTree() { foreach (var item in TreeviewModel.Items) { TreeViewItem itm = (TreeViewItem)TreeviewModel.ItemContainerG

我在WPF中使用treeview,我不想在重新加载绑定的集合时丢失状态(扩展和焦点)

在第一次加载时,很容易仅扩展第一个节点,我使用以下代码:

    private void ExpandFirstNodeTree()
    {
        foreach (var item in TreeviewModel.Items)
        {
            TreeViewItem itm = (TreeViewItem)TreeviewModel.ItemContainerGenerator.ContainerFromItem(item);
            if (itm == null) continue;
            itm.IsExpanded = true;
        }
    }
我使用DependencyProperty来选择一个项目。我浏览TreeView,找到TreeView项,并将项“IsSelected”属性设置为true

private static readonly DependencyProperty SelectedEntityCodeProperty =
        DependencyProperty.Register(PropertyHelper.GetName((EntitiesTreeview e) => e.SelectedEntityCode), typeof (string), typeof (EntitiesTreeview));

    public string SelectedEntityCode
    {
        get { return (string) GetValue(SelectedEntityCodeProperty); }
        set { SetValue(SelectedEntityCodeProperty, value); }
    }

    public EntitiesTreeview()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(EntitiesTreeview_Loaded);
    }

    private void LoadSelectedItem()
    {
        if ((!string.IsNullOrEmpty(SelectedEntityCode))
            && (TreeviewEntity.SelectedItem == null))
            ChangeSelectedItem<ENTITY>(SelectedEntityCode, TreeviewEntity);
    }

    private bool ChangeSelectedItem<T>(string entityCode, ItemsControl itemsControl) where T : ENTITYBASE
    {
        if (itemsControl != null)
        {
            foreach (var item in itemsControl.Items)
            {
                var currentContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                if ((currentContainer != null)
                    && (item is T)
                    && ((item as T).CCODE == entityCode))
                {
                    currentContainer.IsSelected = true;
                    var selectMethod = typeof (TreeViewItem).GetMethod("Select", BindingFlags.NonPublic | BindingFlags.Instance);
                    selectMethod.Invoke(currentContainer, new object[] {true});
                    return true;
                }
                if (ChangeSelectedItem<T>(entityCode, currentContainer))
                    return true;
            }
        }
        return false;
    }
private static readonly dependencProperty SelectedEntityCodeProperty=
DependencyProperty.Register(PropertyHelper.GetName((EntitiesTreeview e)=>e.SelectedEntityCode)、typeof(string)、typeof(EntitiesTreeview));
公共字符串SelectedEntityCode
{
get{return(string)GetValue(SelectedEntityCodeProperty);}
set{SetValue(SelectedEntityCodeProperty,value);}
}
公共实体树视图()
{
初始化组件();
已加载+=新路由EventHandler(实体树视图已加载);
}
私有void LoadSelectedItem()
{
如果((!string.IsNullOrEmpty(SelectedEntityCode))
&&(treevieventity.SelectedItem==null))
更改SelectedItem(SelectedEntityCode,树实体);
}
私有bool ChangeSelectedItem(字符串entityCode,ItemsControl ItemsControl),其中T:ENTITYBASE
{
if(itemsControl!=null)
{
foreach(itemsControl.Items中的变量项)
{
var currentContainer=itemsControl.ItemContainerGenerator.ContainerFromItem(item)作为树视图项;
if((currentContainer!=null)
&&(项目为T)
&&((项目作为T.CCODE==entityCode))
{
currentContainer.IsSelected=true;
var selectMethod=typeof(treevieItem).GetMethod(“选择”,BindingFlags.NonPublic | BindingFlags.Instance);
调用(currentContainer,新对象[]{true});
返回true;
}
if(ChangeSelectedItem(entityCode,currentContainer))
返回true;
}
}
返回false;
}
我的问题是,当我重新加载items集合时,焦点将丢失(选定项),展开的项将折叠。如何分离绑定项和ui? 最后一点,我想以编程方式设置选定项。当依赖项属性更改时,如何重新加载选定项


我已经看过josh smith解决方案(),但我不想在绑定中使用ViewModel集合。我有不同的对象类型绑定和使用ViewModel将是痛苦的。。。海事组织:)

我有不同的对象类型绑定和使用ViewModel将是痛苦的。。。国际海事组织

事实上,您现在遇到的问题正好说明了为什么不使用视图模型太痛苦

如果构建视图模型,则可以在视图模型类中实现
IsSelected
IsExpanded
属性。然后可以将
treevieItem
的相关属性绑定到它们。执行此操作后,对UI中状态的更改将反映在视图模型数据中,如果从数据重新加载UI,则状态的更改将保留


这是实现你想要实现的目标的最简单的方法。另外一个好处是,您可以放弃上面发布的神秘而难以测试的代码的最后一部分。

我真的不明白“重新加载项目集合”的意思