我希望我的程序在添加到列表中时自动选择最近创建的对象。这是当前不起作用的代码:
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,这会导致错误。
当我用Google搜索问题时,我发现以编程方式选择项目的唯一解决方案是在TreeViewItem上使用“IsSelected”属性,但由于这是数据绑定的,因此它不使用或识别TreeViewItem对象。 / p>
以下是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>
答案 0 :(得分:1)
将您的资源包装在某种ViewModel中,或者只创建一个带有IsSelected属性的子类。
e.g。
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;
}