0

TreeView の ContextMenu を作成したいと考えていました。ツリービュー XAML:

<helper:ExtendedTreeView Grid.Row="5" ItemsSource="{Binding OCFrage, Mode=TwoWay}" SelectedItem_="{Binding SelectedItem, Mode=TwoWay}" SelectedItemChanged="treeView1_SelectedItemChanged" x:Name="treeView1" Height="205" Width="215">
    <helper:ExtendedTreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:T_Frage}" ItemsSource="{Binding Wertung, Mode=TwoWay}">
            <TextBlock Text="{Binding Text}"/>
        </HierarchicalDataTemplate>
    </helper:ExtendedTreeView.Resources>
</helper:ExtendedTreeView>

helper:ExtendedTreeView はこのクラスです:

public class ExtendedTreeView : TreeView
{
    public ExtendedTreeView()
        : base()
    {
        this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(self);
    }

    void self(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (SelectedItem != null)
        {
            SetValue(SelectedItem_Property, SelectedItem);
        }
    }

    public object SelectedItem_
    {
        get { return (object)GetValue(SelectedItem_Property); }
        set { SetValue(SelectedItem_Property, value); }
    }
    public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}

これを使用して SelectedItem をバインドし、ViewModel で使用します。

私のTreeViewにはT_Frageタイプの「ヘッダー」があり、それらのノードはT_Wertungタイプであるため、次のようになります

  • T_Frage
    • T_ウェルトゥング
    • T_ウェルトゥング
  • T_Frage
    • T_ウェルトゥング ...

ヘッダーの ContextMenu を作成したかったのです。したがって、ユーザーが T_Frage タイプの TreeViewItem をクリックすると、ContextMenu がポップアップするはずです。私はこのガイドhttp://canhandre.wordpress.com/2012/01/14/wpf-treeview-with-contextmenu/に従いました。現在、コードビハインドでテストするためだけに実行しています。問題は、このコードが実行されているTreeViewItem selectedItem = treeView1.SelectedItem as TreeViewItem;ときです。

編集: ItemsSource を削除し、XAML で通常の TreeViewItems を作成する

  <TreeViewItem Header="Edit" Name="Edit">
       <TreeViewItem Header="Text"/>
       <TreeViewItem Header="Image"/>
       <TreeViewItem Header="Table"/>
  </TreeViewItem>

ここに値を割り当てますTreeViewItem selectedItem = treeView1.SelectedItem as TreeViewItem;。これは、T_Frage 型の TreeView の項目を TreeViewItem 型の変数に割り当てることができないことを意味します。TreeViewItem 型ではない TreeView の項目の ContextMenu を作成するにはどうすればよいですか? 上記のように、T_Frage の型を TreeViewItem に割り当てると、結果は null になります。

4

1 に答える 1

0

CodeBehind ではなく MVVM であることはわかっていますが、最初に CodeBehind でテストしてから、MVVM ですべてを実行したかっただけです。MVVM ですぐに実行するのは難しいと思ったからです... :

<helper:ExtendedTreeView Grid.Row="5" ItemsSource="{Binding OCFrage, Mode=TwoWay}" SelectedItem_="{Binding SelectedItem, Mode=TwoWay}" SelectedItemChanged="treeView1_SelectedItemChanged" x:Name="treeView1" Height="205" Width="215">
    <TreeView.ContextMenu>
        <ContextMenu ItemsSource="{Binding OCContext}"/>
    </TreeView.ContextMenu)
    <helper:ExtendedTreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:T_Frage}" ItemsSource="{Binding Wertung, Mode=TwoWay}">
            <TextBlock Text="{Binding Text}"/>
        </HierarchicalDataTemplate>
    </helper:ExtendedTreeView.Resources>
</helper:ExtendedTreeView>

ビューモデル:

private object _selecteditem;
public object SelectedItem
{
    get { return _selecteditem; }
    set
    {
        OCContext = new ObservableCollection<T_Wertung>();
        if (value is T_Frage)
        {
            T_Frage selected = (T_Frage)value;
    //do something with selected
    OCContext.Add(new T_Wertung(1,"Test",100));
            }
        }
        RaisePropertyChanged(() => SelectedItem);
    }
}

private ObservableCollection<T_Wertung> _occontext;
public ObservableCollection<T_Wertung> OCContext
{
    get
    {
        if (_occontext == null)
            _occontext = new ObservableCollection<T_Wertung>();
        return _occontext;
    }
    set
    {
        _occontext = value;
        RaisePropertyChanged(() => OCContext);
    }
}

TreeView の SelectedItem にバインドしているので、SelectedItem が T_Frage 型であるかどうかを確認できます。正しい場合は、T_Frage 型の新しい変数を作成し、そのコンテキストを SelectedItem の値に設定します。これで、この項目を使って何かを実行し、ContextMenu という名前の List に項目を追加できますOCContext。アイテムを右クリックすると、ContextMenu がポップアップし、のアイテムが表示されますOCContext

于 2013-07-11T09:55:14.807 に答える