gpt4 book ai didi

用作菜单的 WPF TreeView (MVVM 样式)

转载 作者:行者123 更新时间:2023-12-03 10:51:14 27 4
gpt4 key购买 nike

我有一个要求,其中一个菜单应该实现为窗口左侧的 TreeView 。

我知道如何用(菜单)数据(mvvm 方式)填充 TreeView 。

但是:我如何将 TreeView 中的每个对象连接到 ICommand(在 Viewmodel 中)?所以例如双击一个对象会打开一个窗口??

提前致谢

最佳答案

我认为这个问题应该以另一种方式解决,但是......

  • 你会在你的命令
    将模型视为属性。
  • 你从 TreeView 派生和
    TreeView 项目。
  • 你给 TreeView 项目一个
    命令属性,您将其绑定(bind)到
    您的 View 模型的命令
    TreeView itemContainerStyle(在
    xaml)
  • 您覆盖预览鼠标
    在 TreeView 项目上调用
    命令

  • 这是一个示例 TreeViewItem
       public class EditableTreeViewItem : TreeViewItem {

    public ICommand DoubleClickCommand {
    get { return (ICommand)GetValue(DoubleClickCommandProperty); }
    set { SetValue(DoubleClickCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DoubleClickCommandProperty =
    DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(EditableTreeView), new UIPropertyMetadata(null));



    protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e) {

    if (this.DoubleClickCommand!= null) {
    this.DoubleClickCommand.Execute(this.DataContext);
    e.Handled = true;
    }
    base.OnPreviewMouseDoubleClick(e);
    }

    protected override DependencyObject GetContainerForItemOverride() {
    return new EditableTreeViewItem();
    }

    protected override bool IsItemItsOwnContainerOverride(object item) {
    return item is EditableTreeViewItem;
    }
    }

    和一个 TreeView 来使用这个项目
     public class EditableTreeView : TreeView {

    //generate the tree view item
    protected override DependencyObject GetContainerForItemOverride() {
    EditableTreeViewItem item = new EditableTreeViewItem();
    return item;
    }

    protected override bool IsItemItsOwnContainerOverride(object item) {
    return item is EditableTreeViewItem;
    }
    }

    现在,正如上面一些聪明人所说,您最好使用菜单并对其进行样式设置。现在,当您双击 TreeView 项目时,它将调用该命令,而不是按应有的方式展开/折叠。

    这就是您在 xaml 中使用它的方式
             <controls:EditableTreeViewMode=OneWayToSource}"
    ItemsSource="{Binding Path=MyItemsSource}">
    <controls:EditableTreeView.ItemContainerStyle>
    <!-- This Style binds a TreeViewItem to a the ViewModel. -->
    <Style
    TargetType="{x:Type controls:EditableTreeViewItem}">
    <Setter
    Property="DoubleClickCommand"
    Value="{Binding OpenNewWindowCommand}" />
    </Style>
    </controls:EditableTreeView.ItemContainerStyle>
    </controls:EditableTreeView>

    关于用作菜单的 WPF TreeView (MVVM 样式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218908/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com