【问题标题】:View Controls show/hide WPF MVVM查看控件显示/隐藏 WPF MVVM
【发布时间】:2018-01-14 15:11:49
【问题描述】:

我有一个视图(在 MVVM 中),其中包含一些控件,包括树视图。作为数据上下文和模型的 ViewModel,到目前为止一切正常。 **我有两种情况: **

  1. 我希望我的视图针对 Treeview 项目显示 ContextMenu。
  2. 另一种情况,它不应该针对 Treeview 项目显示 ContextMenu

这是否可以使用一个视图,或者为此目的应该有两个不同的视图,对于我个人的工作,如果我有一个视图会更好。

VM 和模型非常简单,只需绑定 View 的属性即可。

View.xaml

<UserControl x:Class="SPM.SystemExplorer.View.SystemExplorerView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:SPM.SystemExplorer.View"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         xmlns:viewModel="clr-namespace:SPM.SystemExplorer.ViewModel"
         xmlns:classes="clr-namespace:SPM.SystemExplorer.Classes">
<UserControl.DataContext>
    <viewModel:SystemExplorerViewVM></viewModel:SystemExplorerViewVM>
</UserControl.DataContext>
<Grid>
    <StackPanel>
        <Label Content="{Binding Test}"></Label>
        <TreeView Grid.Row="1" ItemsSource="{Binding SystemProjects}">
            <TreeView.Resources>
                <HierarchicalDataTemplate  DataType="{x:Type classes:SystemProject}" ItemsSource="{Binding ParticipantProjects}">
                    <StackPanel Orientation="Horizontal">
                        <TreeViewItem Header="{Binding NameOfSystemProject}"></TreeViewItem>
                        <TreeViewItem Header="{Binding AuthorOfSystemProject}"></TreeViewItem>
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate  DataType="{x:Type classes:ParticipantProject}">
                    <StackPanel Orientation="Horizontal">
                        <TreeViewItem Header="{Binding NameOfParticipantProject}"></TreeViewItem>
                        <TreeViewItem Header="{Binding AuthorOfParticipantProject}"></TreeViewItem>
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </StackPanel>
</Grid>

【问题讨论】:

  • 您可以将 SystemExplorerViewVM 的属性设置为“A”或“B”并使用数据触发器。
  • 能写几行举个例子吗,我是WPF的初学者。
  • 我觉得我解释的不对,我想说的是:其实我有两个案例我的看法。首先,如果我右键单击它,我希望看到我的视图在树视图项目上具有上下文菜单。第二种情况,我有相同的视图,但树视图项上没有上下文菜单。

标签: wpf xaml mvvm treeview


【解决方案1】:

您可以将属性 (ShowContextMenu) 添加到您设置为 true/falseSystemExplorerViewVM 类,具体取决于您是否要显示 ContextMenu。然后,您可以在 XAML 中使用 StyleDataTrigger

<TreeView Grid.Row="1" ItemsSource="{Binding SystemProjects}">
    <TreeView.Resources>
        <ContextMenu x:Key="cm">
            <MenuItem Header="1" />
            <MenuItem Header="2" />
        </ContextMenu>
        <Style TargetType="TreeViewItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataContext.ShowContextMenu, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
                    <Setter Property="ContextMenu" Value="{StaticResource cm}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <HierarchicalDataTemplate  DataType="{x:Type classes:SystemProject}" ItemsSource="{Binding ParticipantProjects}">
            <StackPanel Orientation="Horizontal">
                <TreeViewItem Header="{Binding NameOfSystemProject}"></TreeViewItem>
                <TreeViewItem Header="{Binding AuthorOfSystemProject}"></TreeViewItem>
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate  DataType="{x:Type classes:ParticipantProject}">
            <StackPanel Orientation="Horizontal">
                <TreeViewItem Header="{Binding NameOfParticipantProject}"></TreeViewItem>
                <TreeViewItem Header="{Binding AuthorOfParticipantProject}"></TreeViewItem>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView>

【讨论】:

  • 我在数据触发器绑定中遇到一些绑定错误,我正在尝试修复它。
  • 我遇到了这个错误并卡在了这一点上。 BindingExpression 路径错误:在“对象”“TreeViewItem”(名称=“”)上找不到“ShowContextMenu”属性。绑定表达式:路径=ShowContextMenu; DataItem='TreeViewItem'(名称='');目标元素是'TreeViewItem'(名称='');目标属性是“NoTarget”(类型“对象”)
  • 对不起,它应该是 Binding DataContext.ShowContextMenu ...还要确保将属性添加到 SystemExplorerViewVM 类中。
  • “ShowContextMenu”可通过绑定访问,但“DataContext.ShowContextMenu”在 xaml 中不可访问
  • “可在 xaml 中访问”?那是什么意思?尝试运行代码。
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多