Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么左键单击使用DataTemplate创建的TreeViewItem时不选择它们?_C#_Wpf_Xaml_Datatemplate_Treeviewitem - Fatal编程技术网

C# 为什么左键单击使用DataTemplate创建的TreeViewItem时不选择它们?

C# 为什么左键单击使用DataTemplate创建的TreeViewItem时不选择它们?,c#,wpf,xaml,datatemplate,treeviewitem,C#,Wpf,Xaml,Datatemplate,Treeviewitem,我曾尝试使用下面的选项在TreeView中取消选择TreeViewItems,但它只会取消选择TreeViewItems,如果它们是在XAML中静态设置的,如果它们是使用ItemsSource和DataTemplate创建的,则当您设置ItemSource时,SelectedItem对应于您设置的ItemSource集合的DataContext类型,而不是实际的treevieItem 所以你的演员阵容失败了 现在,当您直接在xaml中创建它们而不设置ItemSource时,SelectedIte

我曾尝试使用下面的选项在
TreeView
中取消选择
TreeViewItems
,但它只会取消选择
TreeViewItems
,如果它们是在XAML中静态设置的,如果它们是使用
ItemsSource
DataTemplate
创建的,则当您设置
ItemSource
时,
SelectedItem
对应于您设置的
ItemSource
集合的
DataContext
类型,而不是实际的
treevieItem

所以你的演员阵容失败了

现在,当您直接在xaml中创建它们而不设置
ItemSource
时,
SelectedItem
只是
treevieItem
本身,而
as
强制转换工作正常

更新:

它与您的
DataTemplate

试试这个:

TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if(selectedItem != null) {
    selectedItem.IsSelected = false;
    MyTreeView.Focus();
}
现在,当应用程序运行时,单击一个项目,然后单击
按钮

检查输出窗口,您将看到

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
  TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
  if (selectedItem != null) {
    selectedItem.IsSelected = false;
    MyTreeView.Focus();
  } else {
    Debug.WriteLine("Not TreeViewitem");
    Debug.WriteLine(MyTreeView.SelectedItem);
  }
}
DataTemplate
仅帮助在视图中可视化自定义数据类型。当集合绑定到
TreeView

解决方案:

在您的情况下,要获取实际的
TreeViewItem
请尝试:

Not TreeViewitem
Hello

^^这可能不适用于
HierarchycalDataTemplate
。有关更多选项,请参阅。

您是否真的打算对固定设备的
treevieItem
模板执行一些特殊操作(这需要更改
treevieItem
模板

从表面上看,您似乎可以让
TreeView
处理自己的项目,只需使用一个简单的模板来表示对象:例如

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
  TreeViewItem selectedItem =
    MyTreeView.ItemContainerGenerator.ContainerFromItem(MyTreeView.SelectedItem) as TreeViewItem;
  if (selectedItem == null)
    return;
  selectedItem.IsSelected = false;
  MyTreeView.Focus();
}


我可能误解了你想要达到的目的。

但我使用
数据模板
T
@Bob类型创建了一个
树项目
。这与你的
数据模板
无关。请检查我对答案的更新。@Bob。对于你的要求,我在我的答案底部添加了一个解决方案。试试看是否at对你有用。嗯……我想我需要创建一个
treevieItem
对象进入
treevieItem.Items
或者它不会被这样对待,但这对我有用。我相信,因为
TreeView
继承自
ItemsControl
,它会自动将它的所有项包装在适当的c中容器(
TreeViewItem
)。我想在模板中放入另一个
TreeViewItem
,这意味着它被包装了两次,事情变得有点混乱。
Not TreeViewitem
Hello
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
  TreeViewItem selectedItem =
    MyTreeView.ItemContainerGenerator.ContainerFromItem(MyTreeView.SelectedItem) as TreeViewItem;
  if (selectedItem == null)
    return;
  selectedItem.IsSelected = false;
  MyTreeView.Focus();
}
<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
    <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" />
</DataTemplate>