问题描述
|
我在WPF中使用树形视图,并且在重新加载绑定的集合时,我不想失去状态(扩展和焦点)。
在第一次加载时,仅扩展第一个节点很容易,我使用以下代码:
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;
}
我的问题是,当我重新加载项目集合时,焦点丢失了(选定项目),展开的项目折叠了。如何分隔绑定项和ui?
最后一点,我想以编程方式设置所选项目。依赖项属性更改后,如何重新加载所选项目?
我已经查看过乔什·史密斯解决方案(http://www.codeproject.com/KB/WPF/TreeViewWithviewmodel.aspx),但是我不想使用viewmodel集合进行绑定。我有不同的对象类型进行绑定,使用viewmodel会很痛苦... IMO :)
非常感谢
解决方法
我有不同的对象类型要绑定,使用ViewModel会很痛苦... IMO
实际上,您现在遇到的问题恰恰说明了为什么不使用视图模型太痛苦了。
如果构造视图模型,则可以在视图模型类中实现
IsSelected
和IsExpanded
属性。然后可以将TreeViewItem
的相关属性绑定到它们。完成此操作后,对UI中状态的更改将反映在视图模型数据中,并且如果您从数据中重新加载UI,则状态更改将被保留。
这是实现您要达到的目标的最简单的方法。另外一个好处是,您可以丢弃上面发布的神秘而难以测试的代码的所有最后一部分。