如何以编程方式 select TreeView 中使用 WPF 中数据绑定的值?
How do you programatically select values in TreeView that uses data binding in WPF?
我希望我的程序在将最近创建的对象添加到列表时自动select。这是当前不起作用的代码:
public static void CreateResourceTree(TreeView selector,IEnumerable<Resource> resources,Resource onRefresh=null)
{
ActiveResources.Clear();
ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
.ThenBy(x=>x.Label)
.ToList());
selector.Items.Refresh();
selector.SelectedItem=onRefresh;
}
该代码旨在将值设置为 onRefresh
的值,不幸的是,SelectedItem 为 ReadOnly,这会导致错误。
当我用谷歌搜索这个问题时,我发现以编程方式 selecting 项目的唯一解决方案是在 TreeViewItem 上使用 "IsSelected" 属性,但由于这是数据 -绑定,它不使用或识别 TreeViewItem 对象。
这是 XAML 代码,以备不时之需:
<TreeView ItemsSource="{Binding ResourceList}" Grid.Column="0" Grid.Row="3" x:Name="ResourcesTree" SelectedItemChanged="ResourcesTree_OnSelectedItemChanged" Margin="0,4,0,0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type xmlclass:Resource}" ItemsSource="{Binding Children}">
<ContentPresenter Content="{Binding Output}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
将您的资源包装在某种 ViewModel 中,或者只创建一个带有 IsSelected 属性 的子 class。
例如
public class SelectableResource : Resource
{
public bool IsSelected { get; set; }
}
然后创建样式以将 TreeViewItem.IsSelected 绑定到新的 属性:
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
您现在可以从数据端设置所选项目,而不是尝试手动控制视图。
public static void CreateResourceTree(TreeView selector,IEnumerable<SelectableResource> resources,SelectableResource onRefresh=null)
{
ActiveResources.Clear();
ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
.ThenBy(x=>x.Label)
.ToList());
onRefresh.IsSelected = true;
}
我希望我的程序在将最近创建的对象添加到列表时自动select。这是当前不起作用的代码:
public static void CreateResourceTree(TreeView selector,IEnumerable<Resource> resources,Resource onRefresh=null)
{
ActiveResources.Clear();
ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
.ThenBy(x=>x.Label)
.ToList());
selector.Items.Refresh();
selector.SelectedItem=onRefresh;
}
该代码旨在将值设置为 onRefresh
的值,不幸的是,SelectedItem 为 ReadOnly,这会导致错误。
当我用谷歌搜索这个问题时,我发现以编程方式 selecting 项目的唯一解决方案是在 TreeViewItem 上使用 "IsSelected" 属性,但由于这是数据 -绑定,它不使用或识别 TreeViewItem 对象。
这是 XAML 代码,以备不时之需:
<TreeView ItemsSource="{Binding ResourceList}" Grid.Column="0" Grid.Row="3" x:Name="ResourcesTree" SelectedItemChanged="ResourcesTree_OnSelectedItemChanged" Margin="0,4,0,0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type xmlclass:Resource}" ItemsSource="{Binding Children}">
<ContentPresenter Content="{Binding Output}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
将您的资源包装在某种 ViewModel 中,或者只创建一个带有 IsSelected 属性 的子 class。
例如
public class SelectableResource : Resource
{
public bool IsSelected { get; set; }
}
然后创建样式以将 TreeViewItem.IsSelected 绑定到新的 属性:
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
您现在可以从数据端设置所选项目,而不是尝试手动控制视图。
public static void CreateResourceTree(TreeView selector,IEnumerable<SelectableResource> resources,SelectableResource onRefresh=null)
{
ActiveResources.Clear();
ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
.ThenBy(x=>x.Label)
.ToList());
onRefresh.IsSelected = true;
}