c# - 如何将树视图中的选定项目标记为选定项目(WPF)?
问题描述
我是 c# 和 wpf 的新手。我有一个treeview,我需要的是 - 当用户单击其中一个项目时,将此项目标记为选中。例如,当用户单击它标记为选中的行时,它在 DataGrid 中实现,用户可以轻松了解选中了哪一行。
我的 TreeView 实现是
<TreeView Name="Tv_request"
Grid.Row="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ItemsSource="{Binding Path=RequestSet}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate
ItemsSource="{Binding Childrens}"
DataType="{x:Type local:IRequest}">
<TreeViewItem MouseUp="TreeViewItem_MouseUp"
Header="{Binding TypePage}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
我可以通过 TreeViewItem_MouseUp 事件获得点击项目的方式,但我需要实现标记选择项目。
如何实施?
编辑
为了获得点击的项目,我正在使用这种方法
private void TreeViewItem_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var tree = sender as TreeViewItem;
if (tree != null)
{
IRequest item = tree.DataContext as IRequest;
Presenter?.TreeViewSelectedItem(item);
}
}
这样我就可以访问我选择的项目,但是如果我将其更改为
private void TreeViewItem_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var tree = sender as ContentPresenter;
if (tree != null)
{
IRequest item = tree.DataContext as IRequest;
Presenter?.TreeViewSelectedItem(item);
}
}
所以,tree.DataContext
返回我NodeType
,逻辑上没问题,因为我设置了
<ContentPresenter Content="{Binding NodeType}"
MouseUp="TreeViewItem_MouseUp"/>
代替
<TreeViewItem MouseUp="TreeViewItem_MouseUp"
Header="{Binding NodeType}"/>
所以,问题是,我怎样才能获得整个点击的对象而不仅仅是他的NodeType
?
解决方案
首先,您的项目模板是在 TreeViewItem 内创建一个 TreeViewItem。它应该如下所示:
<HierarchicalDataTemplate
ItemsSource="{Binding Childrens}"
DataType="{x:Type local:IRequest}">
<ContentPresenter Content="{Binding TypePage}"/>
</HierarchicalDataTemplate>
TreeViewItem 将由 WPF 自动创建,并且HierarchicalDataTemplate
您提供的内容将应用于它。
其次,TreeViewItem 有一个名为IsSelected
. 您可以使用 Style 将此属性绑定到IRequest
对象的属性:
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
<Setter Property="IsSelected" Value="{Binding RequestIsSelected}" />
</Style>
或者,如果您愿意,可以使用 anEventSetter
为TreeViewItem.Selected
事件提供处理程序:
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
<EventSetter RoutedEvent="Selected" Value="TreeViewItem_Selected" />
</Style>
您也可以使用该TreeView.SelectionChanged
事件而不是处理单个树视图项目,但请注意您(令人讨厌!)无法从 TreeView 本身中选择新项目。
推荐阅读
- reactjs - React JS:@material-ui:无效的 Hook 调用:在 Stackblitz 上
- c# - 如何将动态模型作为“T”传递给 C# 泛型函数
- node.js - 如何通过 AWS lambda nodejs 函数索引存储在 S3 中的 XML 文件?
- php - RSA:从 Python 中的 n 和 e 生成公钥,PHP 给我两个不同的公钥
- influxdb - 为什么任何用户都可以登录influxdb?
- python-3.x - Boto3:获取所有可用 S3 存储桶详细信息的详细信息
- angular - 添加 LazyLoad - 'mat-icon' 不是已知元素
- reactjs - 更新依赖于 React-Hooks 中其他计算状态的状态
- django - 使用 Docker Container - Django 构建后维护媒体文件
- automation - 有没有办法让测试让它的 TestCaseSource 从外部源(如 excel)读取数据?