Smallestearth
Smallestearth

Reputation: 45

View Controls show/hide WPF MVVM

I have a View (in MVVM) which have some controls including a treeview. A ViewModel which is the datacontext and a Model, everything is working fine till now. **I have two cases: **

  1. I want my View to show a ContextMenu against Treeview items.
  2. The other case, it should not show a ContextMenu against the Treeview items

Is this possible with one View or there should be two different Views for this purpose, for my personal work it would be better if I have one View.

The VM and model are very simple just having the binded properties of the 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>

Upvotes: 2

Views: 825

Answers (1)

mm8
mm8

Reputation: 169360

You could add a property (ShowContextMenu) to your SystemExplorerViewVM class that you set to true/false depending on whether you want to display the ContextMenu. You could then use a Style with a DataTrigger in your XAML:

<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>

Upvotes: 2

Related Questions