0
<TreeView Name="MyTreeView" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling">
    <TreeView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </TreeView.ItemsPanel>
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
            <TreeViewItem IsHitTestVisible="True" IsEnabled="True">
            <TreeViewItem.Header>
                <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"
                           IsHitTestVisible="True" IsEnabled="True"/>
            </TreeViewItem.Header>
            </TreeViewItem>
        </DataTemplate>
    </TreeView.Resources>
    <TreeView.Items>
        <TreeViewItem Header="Data Warehouse">
            <TreeViewItem.Items>
                <TreeViewItem Header="Platforms">
                   <TreeViewItem.Items>
                       <TreeViewItem ItemsSource="{Binding OBJS, Converter={StaticResource COBJSourceConverter}, ConverterParameter=Fixed}">
                           <TreeViewItem.Header>
                               <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                          Path=Parent.Items.Count,
                                          StringFormat=Fixed Devices ({0})}">
                               </TextBlock>
                           </TreeViewItem.Header>
                       </TreeViewItem>
                  </TreeViewItem.Items>
                </TreeViewItem>
            </TreeViewItem.Items>
        </TreeViewItem>
    </TreeView.Items>
</TreeView>

DataTemplate で作成された TreeViewItems を左クリックしても選択されないのはなぜですか? コードでそれらを選択した場合、それらを再度選択したり、選択を解除したりできないのはなぜですか?

TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if(selectedItem != null) {
    selectedItem.IsSelected = false;
    MyTreeView.Focus();
}

TreeViewItems以下を使用して で選択を解除しようとしましたが、XAML で静的に設定されている場合にTreeViewのみ選択が解除され、 andを使用して作成された場合は選択解除されません。TreeViewItemsItemsSourceDataTemplate

4

2 に答える 2

1

TreeViewItem固定デバイス用のテンプレートで実際に何か特別なことをするつもりですか(TreeViewItemテンプレートを変更する必要がありますか?

TreeView一見すると、独自のアイテムを に任せて、オブジェクト表現に単純なテンプレートを使用するだけでよいように思えます。

<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
    <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" />
</DataTemplate>

あなたが達成しようとしていることを誤解しているかもしれません。

于 2013-07-10T15:23:41.837 に答える
1

を設定ItemSourceすると、実際の ではなく、設定したコレクションの Type のようにタイプにSelectedItem対応します。DataContextTItemSourceTreeViewItem

したがって、キャストが失敗する理由。

を設定せずに xaml で直接作成すると、それ自体だけでItemSource、キャストは正常に機能します。SelectedItemTreeViewitemas

アップデート:

それはあなたとは何の関係もありませんDataTemplate

これを試して:

<Window.Resources>
  <x:Array x:Key="someArray"
            Type="sys:String">
    <sys:String>Hello</sys:String>
    <sys:String>World</sys:String>
  </x:Array>
</Window.Resources>
<StackPanel>
  <TreeView x:Name="MyTreeView"
            ItemsSource="{DynamicResource someArray}" />
  <Button Click="ButtonBase_OnClick"
          Content="Some" />
</StackPanel>

および分離コード:

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);
  }
}

アプリの実行時にアイテムをクリックしてから、Button

出力ウィンドウを確認すると、

Not TreeViewitem
Hello

DataTemplateビューでカスタム データ型を視覚化するのに役立つだけです。これは、コレクションがTreeView

解決:

あなたの場合、実際のTreeViewItem試行を取得するには:

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();
}

^^これはおそらく では機能しませんHierarchicalDataTemplate。その他のオプションについては、これを参照してください。

于 2013-07-10T15:02:33.663 に答える