如何从View模型

时间:2016-10-11 11:46:33

标签: wpf wpf-controls

您好我已经创建了转换器来更改Treeview控件的行为,这工作正常。这是我的代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DevLake.OrgChart.UI.View
{
    /// <summary>
    /// Interaction logic for TreeView.xaml
    /// </summary>
    public partial class TreeView : UserControl
    {
        public TreeView()
        {
            InitializeComponent();
        }
    }

    class TreeViewLineConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            TreeViewItem item = (TreeViewItem)value;
            ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
            return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }
}

但是现在我想把这个代码移到视图模型中。但是我无法从视图模型创建TreeViewItem的对象。请帮我在MVVM模式中如何做到这一点

我的UserControl:

  <UserControl x:Class="DevLake.OrgChart.UI.View.TreeView"
                 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:local="clr-namespace:DevLake.OrgChart.UI.View"
                 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">

        <UserControl.Resources>
            <local:TreeViewLineConverter x:Key="LineConverter"/>

            <SolidColorBrush x:Key="GlyphBrush" Color="#444" />

            <!--=================================================================
          TreeViewItem
      ==================================================================-->
            <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
                <Setter Property="Focusable" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ToggleButton">
                            <Grid
                  Width="15"
                  Height="13"
                  Background="White">
                                <Path x:Name="ExpandPath"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Center"
                    Margin="1,1,1,1"
                    Fill="{StaticResource GlyphBrush}"
                    Data="M 4 0 L 8 4 L 4 8 Z"/>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsChecked"
                       Value="True">
                                    <Setter Property="Data"
                        TargetName="ExpandPath"
                        Value="M 0 4 L 8 4 L 4 8 Z"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="TreeViewItemFocusVisual">
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border>
                                <Rectangle Margin="0,0,0,0"
                         StrokeThickness="5"
                         Stroke="Black"
                         StrokeDashArray="1 2"
                         Opacity="0"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="{x:Type TreeViewItem}"
             TargetType="{x:Type TreeViewItem}">
                <Setter Property="Background"
              Value="Transparent"/>
                <Setter Property="HorizontalContentAlignment"
              Value="{Binding Path=HorizontalContentAlignment,
                  RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                <Setter Property="VerticalContentAlignment"
              Value="{Binding Path=VerticalContentAlignment,
                  RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                <Setter Property="Padding"
              Value="1,0,0,0"/>
                <Setter Property="Foreground"
              Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                <Setter Property="FocusVisualStyle"
              Value="{StaticResource TreeViewItemFocusVisual}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TreeViewItem}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition MinWidth="19"
                              Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>

                                <!-- Connecting Lines -->
                                <Rectangle x:Name="HorLn" Height="1" Stroke="#8888"  Margin="10,0,0,0" SnapsToDevicePixels="true"/>
                                <Rectangle x:Name="VerLn" Width="1" Stroke="#8888" Grid.RowSpan="2" SnapsToDevicePixels="true"/>
                                <ToggleButton x:Name="Expander"
                          Style="{StaticResource ExpandCollapseToggleStyle}"
                          IsChecked="{Binding Path=IsExpanded,
                                  RelativeSource={RelativeSource TemplatedParent}}"
                          ClickMode="Press"/>
                                <Border Name="Bd"
                      Grid.Column="1"
                      Background="{TemplateBinding Background}"
                      BorderBrush="{TemplateBinding BorderBrush}"
                      BorderThickness="{TemplateBinding BorderThickness}"
                      Padding="{TemplateBinding Padding}">
                                    <ContentPresenter x:Name="PART_Header"
                              ContentSource="Header"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                                </Border>
                                <ItemsPresenter x:Name="ItemsHost"
                          Grid.Row="1"
                          Grid.Column="1"
                          Grid.ColumnSpan="2"/>
                            </Grid>
                            <ControlTemplate.Triggers>

                                <!-- This trigger changes the connecting lines if the item is the last in the list -->
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource LineConverter}}" Value="true">
                                    <Setter TargetName="VerLn"
                        Property="Height"
                        Value="6"/>
                                    <Setter TargetName="VerLn"
                        Property="VerticalAlignment"
                        Value="Top"/>
                                </DataTrigger>
                                <Trigger Property="IsExpanded"
                       Value="false">
                                    <Setter TargetName="ItemsHost"
                        Property="Visibility"
                        Value="Collapsed"/>
                                </Trigger>
                                <Trigger Property="HasItems"
                       Value="false">
                                    <Setter TargetName="Expander"
                        Property="Visibility"
                        Value="Hidden"/>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="HasHeader"
                             Value="false"/>
                                        <Condition Property="Width"
                             Value="Auto"/>
                                    </MultiTrigger.Conditions>
                                    <Setter TargetName="PART_Header"
                        Property="MinWidth"
                        Value="75"/>
                                </MultiTrigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="HasHeader"
                             Value="false"/>
                                        <Condition Property="Height"
                             Value="Auto"/>
                                    </MultiTrigger.Conditions>
                                    <Setter TargetName="PART_Header"
                        Property="MinHeight"
                        Value="19"/>
                                </MultiTrigger>
                                <Trigger Property="IsSelected"
                       Value="true">
                                    <Setter TargetName="Bd"
                        Property="Background"
                        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                    <Setter Property="Foreground"
                        Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsSelected"
                             Value="true"/>
                                        <Condition Property="IsSelectionActive"
                             Value="false"/>
                                    </MultiTrigger.Conditions>
                                    <Setter TargetName="Bd"
                        Property="Background"
                        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                    <Setter Property="Foreground"
                        Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                </MultiTrigger>
                                <Trigger Property="IsEnabled"
                       Value="false">
                                    <Setter Property="Foreground"
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

        </UserControl.Resources>


        <StackPanel>
            <TreeView x:Name="tvMain" ItemsSource="{Binding Root}" BorderThickness="0">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding ImagePath}" MaxHeight="40" MaxWidth="40" Margin="2"/>
                            <TextBlock VerticalAlignment="Center">            
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} {1}">
                                    <Binding Path="FirstName"/>
                                    <Binding Path="LastName"/>
                                </MultiBinding>


                            </TextBlock.Text>
                            </TextBlock>
                            <StackPanel.Style>
                                <Style>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsSelected}" Value="true">
                                            <Setter Property="StackPanel.Background" Value="LightBlue"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </StackPanel.Style>
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
     <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
            <Setter Property="IsExpanded" Value="True"/>
            <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
        </Style>
    </TreeView.ItemContainerStyle>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectedItemChanged">
                        <i:InvokeCommandAction Command="{Binding SelectedCommand}" 
                                               CommandParameter="{Binding ElementName=tvMain, Path=SelectedItem}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TreeView>
        </StackPanel>
    </UserControl>

0 个答案:

没有答案