rad*_*rad 5 c# wpf treeview mvvm
我在WPF中使用树视图,当我重新加载绑定的集合时,我不想放松状态(扩展和聚焦).
在第一次加载时,只需扩展第一个节点,我使用以下代码:
private void ExpandFirstNodeTree()
{
foreach (var item in TreeviewModel.Items)
{
TreeViewItem itm = (TreeViewItem)TreeviewModel.ItemContainerGenerator.ContainerFromItem(item);
if (itm == null) continue;
itm.IsExpanded = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我重新加载项目集合时,焦点丢失(选定项目)并且展开的项目已折叠.如何分隔绑定项和ui?最后一点,我想以编程方式设置一个选定的项目.如何在依赖项属性更改时重新加载所选项目?
我已经看过josh smith解决方案(http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx),但我不想将ViewModel集合用于绑定.我有不同的对象类型绑定和使用ViewModel将痛苦... IMO :)
非常感谢
我有不同的对象类型绑定和使用ViewModel将痛苦... IMO
实际上,您现在遇到的问题正好说明了为什么不使用视图模型太痛苦了.
如果构建视图模型,则可以在视图模型类中实现IsSelected和IsExpanded属性.然后,您可以将它们的相关属性绑定TreeViewItem到它们.执行此操作后,UI中状态的更改将反映在视图模型数据中,如果从数据重新加载UI,则将保留状态更改.
这是实现您想要实现的目标的最简单方法.作为额外的好处,您可以丢弃上面发布的神秘难以测试的代码隐藏的最后一个废品.
| 归档时间: |
|
| 查看次数: |
7947 次 |
| 最近记录: |