5

WPF アプリケーションでツリービュー コントロールを使用する必要があります。ネストされたデータ (DataItem 型) を作成し、それをツリービュー コントロールに割り当てます。階層データ テンプレートを作成し、ツリービュー コントロールに割り当てます コンテキスト メニューをツリービューに追加します. SelectedItem の 1 つのプロパティ (DataItem である必要があると思います)、「IsEnabled」でメニュー項目を無効または有効にします。

それにアプローチする方法は?

            <HierarchicalDataTemplate x:Key="dt" ItemsSource="{Binding Items}">
                <TextBlock x:Uid="TextBlock_2" Text="{Binding Name}">
                </TextBlock>
            </HierarchicalDataTemplate>

        <TreeView x:Name="tree_3" Height="200"
                  ItemTemplate="{StaticResource dt}"
                  >
            <TreeView.ContextMenu>
                <ContextMenu>
                    <MenuItem ItemsSource="{Binding SelectedItem}"
                        Header="doA" IsEnabled="{Binding IsEnabled, Mode=OneWay}"  />
                    <MenuItem Header="doB" IsEnabled="False"/>
                    <MenuItem Header="doC" />
                </ContextMenu>
            </TreeView.ContextMenu>
        </TreeView>

class DataItem : DependencyObject //INotifyPropertyChanged
{
    private List<DataItem> _items = new List<DataItem>();
    public List<DataItem> Items 
    {
        get
        {
            return _items;
        }
    }

    public string Name { get; set; }
    public int Category { get; set; }
    public bool IsEnabled { get; set; }
}

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        List<DataItem> allData = new List<DataItem>();

        DataItem i1 = new DataItem() { Name = "Test1", Category = 1, IsEnabled = false };
        DataItem i2 = new DataItem() { Name = "Test2", Category = 2, IsEnabled = false };
        DataItem i3 = new DataItem() { Name = "Test3", Category = 3, IsEnabled = true };

        DataItem t1 = new DataItem() { Name = "Template 1", Category = 1, IsEnabled = true  };
        DataItem t2 = new DataItem() { Name = "Template 2", Category = 1, IsEnabled = false };

        i1.Items.Add(t1);
        i1.Items.Add(t2);

        allData.Add(i1);
        allData.Add(i2);
        allData.Add(i3);
        tree_3.ItemsSource = allData;
    }

以下の方法で問題を解決しました。

  1. コンテキスト メニュー リソースを作成する

    <ContextMenu x:Uid="ContextMenu_1" x:Key="TreeViewItemContextMenu"
             ItemsSource="{Binding}">
        <MenuItem x:Uid="MenuItem_1" 
              Header="Rename" 
              IsEnabled="{Binding Path=., Converter={StaticResource renameMenuConverter}}"
              Click="RenameMenu_OnClick"
              />
    </ContextMenu>
    
  2. ツリー ビュー アイテムのスタイルを作成し、上記のコンテキスト メニュー リソースを使用する

    <Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1">
    <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource           TreeViewItemContextMenu}">
    </Setter>
    ...
    </Style>
    
  3. コンバーターを実装します。上記のマークアップ拡張によると、convert で渡されたパラメーターは現在選択されている項目であるため、そのプロパティを取得してチェックを行うことができます。

ご協力ありがとうございます。

4

1 に答える 1

1

私はこれをWinForm TreeViewで使用して成功しました。

DataItem を宣言するときに、タグ プロパティも含めます。

DataItem i1 = new DataItem() { Name = "Test1", 
                  Category = 1, IsEnabled = false, Tag = "Test1" };

TreeView の EventListener で、sender オブジェクトをキャストするか、TreeView から SelectedItem を取得します。

//It is only Algorithm:
if treeview1.selecedItem.Tag = "Test1" then
    //code for execution
end if

同様に、sender オブジェクトについても、

//It is only Algorithm:
variable treeNode = cast ( sender to TreeView ).SelectedItem
if treeNode.Tag = "Test1" then
    //code for execution
end if

「実行用コード」に関しては、MenuItems を有効または無効にすることができます。

注: ContextMenu タグで MenuItems の x:Name 属性を宣言していません。MenuItems にアクセスするには、それを行ってください。

IsEnabled は、WPF で対話可能なアイテムを有効または無効にするための直接のプロパティです。

私は C# よりも VB 派なので、アルゴリズムを示しただけです。だから私はコードを台無しにしたくありません。

すてきな一日を :)

于 2012-05-22T12:05:39.317 に答える