1

私はC#で作業しており、「階層型コンボボックス」を作成するための解決策を見つけようとしています.iv'eはインターネット上で何時間も検索しましたが、この問題の実際の解決策は見つかりませんでした.

最も近いのは、グループの説明を使用して通常の wpf コンボボックスを操作することですが、それでも私には十分ではなく、自分で進める場所がありません。

達成するためにコントローラーが必要なもの:

  • 各アイテムはサブアイテムを持つことができます。サブアイテムがない場合、アイテムは選択可能です。サブアイテムがある場合、再帰的にサブアイテムを持たないサブアイテムのみが選択可能です。

  • コンボ ボックスのポップアップは、通常のツリー ビューと同じように、インデントされたすべてのアイテムを最終的に表示します。

最終的には、次のようになります。


例:

Folder
   Selectable Item
   Folder
       Selectable Item
       Selectable Item
   Selectable Item

  • ご覧のとおり、フォルダー自体は選択可能ではないはずです。

これまでに得たものは、次の記事で確認できます: http://www.jarloo.com/wpf-combobox-with-groupings/

PS:私は、作業が間違いなくTreeViewで行われるべきであるように見えることを認識していると言わなければなりません.問題は、私はすでにそれをテストしており、ツリービューには選択可能な項目などを含むコンボボックスロジックがありません...

TLDR: 基本的に、階層型コンボボックスが必要です。そのコンボボックスには、親以外のノードのみを選択できるツリー ビューが内部にある必要があります。

何か案は?

4

1 に答える 1

0

コメント セクションで述べたように、あなたの状況で a がどのようにComboBox便利かわかりません。

これを使用してそのようなことを達成する方法の例を次に示しますTreeView

MSDN の例を使用して、ノードを表すクラスを作成しますTreeView

public class Path
{
    public string Name { get; set; }
    public bool IsLeaf { get; set; }
    public ObservableCollection<Path> Children { get; set; }
}

HierarchicalDataTemplateを作成して表示する

<HierarchicalDataTemplate x:Key="LeafTemplate" ItemsSource="{Binding Children}">
      <TextBlock FontStyle="Italic" Text="{Binding Name}"  />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="FolderTemplate" ItemsSource="{Binding Children}" ItemTemplate="{StaticResource LeafTemplate}">
      <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>

それを使用するaTreeViewを作成し、葉ではないパスのフォーカスを拒否します

<TreeView Width="400"  Height="300" ItemsSource="{Binding Paths}" 
          ItemTemplate="{StaticResource FolderTemplate}" x:Name="myTreeView">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
           <Setter Property="Focusable" Value="{Binding IsLeaf}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

この例をテストしたい場合は、Paths塗りつぶしに次のコードを使用できます

Paths = new ObservableCollection<Path>();
var p1 = new Path { Name = "Folder 1", IsLeaf = false , Children = new ObservableCollection<Path>() };
var p11 = new Path { Name = "Item 1-1", IsLeaf = true, Children = new ObservableCollection<Path>() };
var p12 = new Path { Name = "Item 1-2", IsLeaf = true, Children = new ObservableCollection<Path>() };
var p13 = new Path { Name = "Folder 1-3", IsLeaf = false, Children = new ObservableCollection<Path>() };
var p131 = new Path { Name = "Item 1-3-1", IsLeaf = true, Children = new ObservableCollection<Path>() };

// Build path's
p13.Children.Add(p131);
p1.Children.Add(p11);
p1.Children.Add(p12);
p1.Children.Add(p13);
Paths.Add(p1);

もちろん、彼の可視性を制御し、ボタンがクリックされたときなど、いつでも表示させることができます。

        <ToggleButton Content="Select Item" x:Name="treeViewVisible"/>
        <TreeView Width="400"  Height="300" ItemsSource="{Binding Paths}"
                  Visibility="{Binding ElementName=treeViewVisible, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}" .... />

お役に立てれば

于 2013-10-17T13:25:03.727 に答える