gpt4 book ai didi

c# - WPF Treeview 仅展开第一个节点和选定的项目?

转载 作者:太空狗 更新时间:2023-10-29 22:54:50 42 4
gpt4 key购买 nike

我在 WPF 中使用 TreeView ,我不想在重新加载绑定(bind)集合时丢失状态(展开和聚焦)。

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

    private void ExpandFirstNodeTree()
{
foreach (var item in TreeviewModel.Items)
{
TreeViewItem itm = (TreeViewItem)TreeviewModel.ItemContainerGenerator.ContainerFromItem(item);
if (itm == null) continue;
itm.IsExpanded = true;
}
}

我使用 DependencyProprety 来选择一个项目。我探索 TreeView,找到 TreeViewItem 并将项目“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;
}

我的问题是,当我重新加载项目集合时,焦点丢失(选定的项目)并且展开的项目被折叠。如何分离绑定(bind)项和 ui ?最后一点,我想以编程方式设置一个选定的项目。当依赖项属性更改时,如何重新加载所选项目?


我已经看过 josh smith 解决方案 ( http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx ),但我不想使用 ViewModel 集合进行绑定(bind)。我有不同的对象类型要绑定(bind)并使用 ViewModel 会很痛苦... IMO :)

最佳答案

I have different object type to bind and use ViewModel will be to painfull... IMO

事实上,您现在遇到的问题恰恰说明了为什么使用 View 模型太痛苦了。

如果构建 View 模型,则可以在 View 模型类中实现 IsSelectedIsExpanded 属性。然后,您可以将 TreeViewItem 的相关属性绑定(bind)到它们。执行此操作后,UI 中状态的更改将反射(reflect)在 View 模型数据中,如果您从数据重新加载 UI,状态更改将保留。

这是实现您想要实现的目标的最简单方法。作为一个额外的好处,您可以丢弃上面发布的神秘且难以测试的代码隐藏的所有最后碎片。

关于c# - WPF Treeview 仅展开第一个节点和选定的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114726/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com