从类.cs更新TreeView

时间:2014-07-22 21:07:17

标签: c# wpf

大家早上好;

我的Window WPF中有一个TreeView,我使用DataBinding来覆盖我的TreeView。

现在我有了另一个MyDesign.cs类,我希望从这个类中提升我的TreeView的主题。

这里我的代码:

MainWindow.xaml:

<Window x:Class="TreeViewAndDataBanding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:self="clr-namespace:TreeViewAndDataBanding"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <ContextMenu x:Key="MyDesignContextMenu">
            <MenuItem Header="Paste" Command="{x:Static ApplicationCommands.Paste}"/>

            <MenuItem Header="Search" Command="{x:Static self:MyDesign.Search}"/>
        </ContextMenu>



        <self:test x:Key="test"/>

    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="24*"/>
            <ColumnDefinition Width="23*"/>
        </Grid.ColumnDefinitions>
        <TreeView x:Name="MyToolBox"  ItemsSource="{StaticResource test}" Grid.Column="1" >
            <TreeView.ItemTemplate>
                <DataTemplate>
                        <TreeViewItem Header="All Cars">
                        <TreeViewItem Header="{Binding Path= Voiture}">
                            <TreeViewItem Header="{Binding Path=Vitesse}"></TreeViewItem>
                        </TreeViewItem>
                        </TreeViewItem>

                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        <s:MyDesign Focusable="true" x:Name="MyDesigner"

                            Background="{StaticResource WindowBackgroundBrush}"
                            Margin="10" FocusVisualStyle="{x:Null}"
                            ContextMenu="{StaticResource MyDesignContextMenu}" Grid.Coulum="0"/>


    </Grid>
</Window>

MenuItem.cs

  namespace TreeViewAndDataBanding
    {
        public class MenuItem
        {
            private string _Voiture;
            private string _Vitesse;

            public MenuItem( string Voiture,string Vitesse)
            {
                this._Voiture = Voiture;
                this._Vitesse = Vitesse;
           }

            public string Voiture
            {
                get { return _Voiture; } 
            }

            public string Vitesse
            {
                get { return _Vitesse; }
            }
        }
    }

test.cs中

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace TreeViewAndDataBanding
{
    public class test : ObservableCollection<MenuItem> 
    {
       public test()
       {
           Add(new MenuItem("Rapide", "Ferrari F430"));

       }


    }
}

在这里我的MyDesign.Command.Cs类,我希望能够在此类中更新我的treeView(在方法搜索中)

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace TreeViewAndDataBanding
{
    public class MyDesign
    {
        public static RoutedCommand Search = new RoutedCommand();

        public MyDesign()
        {
            this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste_Executed));

            this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Search_Executed));
        }


        private void Search_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            // d'ici je veux modifier mon TreeView

            /******************************************************************************************/
            /****** ici je veux modifier  et mettre a jour mon Treeview dans l'interface *************/
            /****************************************************************************************/


        }



        private void Paste_Executed(object sender, ExecutedRoutedEventArgs e)
        {

        }




    }
}
你可以帮我吗?有任何想法吗??

1 个答案:

答案 0 :(得分:1)

执行此MVVM样式更清晰,更易于维护,并使WPF更有意义。一个例子(我已经重新命名了一些东西,因为我的法语很好。不存在)

创建一个ViewModel:

public class ViewModel {
    public ObservableCollection<CarType> CarTypes { get; private set; }

    public ViewModel() {
        CarsTypes = new ObservableCollection<CarType>();
        var sportsCars = new CarType("Sports cars");
        sportscars.Cars.Add(new Car() { Make = "Ferrari", Model = "F430" });
        CarTypes.Add(sportsCars);
    }
}

你的观点:

<Window ...
    <Window.DataContext>
         <local:ViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Cars}" DataType="{x:Type local:CarType}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:Car}">
            <StackPanel>
                <TextBlock Text="{Binding Make}"/>
                <TextBlock> - </TextBlock>
                <TextBlock Text="{Binding Model}"/>
        </DataTemplate>
    </Window.Resources>
    <TreeView ItemsSource="{Binding CarTypes}"/>
</Window>

请注意我直接输入SO,所以我没有编译它。我可能包含一些错误。但正如您所看到的,使用MVVM,这是非常少的代码。

现在,您只需在ViewModel上向Collection添加新实例,您的UI就会更新。可以使用RelayCommands在ViewModel上实现命令。