大家早上好;
我的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)
{
}
}
}
你可以帮我吗?有任何想法吗??
答案 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上实现命令。