C# 如何为多个视图模型实现相同的搜索功能?
我有一个主视图,其中有一个选项卡控件。每个选项卡的内容都是一个树状视图,呈现在不同的视图中。 这是我的主要视图,其中我使用了另外两个视图 在我的第一个列表视图中,我有一个树视图、一个文本框和一个按钮C# 如何为多个视图模型实现相同的搜索功能?,c#,wpf,xaml,mvvm,treeview,C#,Wpf,Xaml,Mvvm,Treeview,我有一个主视图,其中有一个选项卡控件。每个选项卡的内容都是一个树状视图,呈现在不同的视图中。 这是我的主要视图,其中我使用了另外两个视图 在我的第一个列表视图中,我有一个树视图、一个文本框和一个按钮 <TabControl x:Name ="MainTab" SelectionChanged="OnTabSelectionChanged"> <TabItem Header="First" > <view:FirstListView x:Nam
<TabControl x:Name ="MainTab" SelectionChanged="OnTabSelectionChanged">
<TabItem Header="First" >
<view:FirstListView x:Name="FirstView"/>
</TabItem>
<TabItem Header="Second" >
<view:SecondListView x:Name ="SecondView"/>
</TabItem>
</TabControl>
SearchFamilityTreeCommand是从ICommand派生的类,execute方法调用函数来执行搜索。这在FirstViewModel中显示
#region SearchCommand
public ICommand SearchCommand
{
get { return _searchCommand; }
}
private class SearchFamilyTreeCommand : ICommand
{
readonly FunctionListViewModel _functionTree;
public SearchFamilyTreeCommand(FunctionListViewModel functionTree)
{
_functionTree = functionTree;
}
public bool CanExecute(object parameter)
{
return true;
}
event EventHandler ICommand.CanExecuteChanged
{
add { }
remove { }
}
public void Execute(object parameter)
{
_functionTree.PerformSearch();
}
}
#endregion
搜索方法与类型无关。这取决于其特定型号中存在的类型。执行搜索所需的数据显示在此视图模型中
这是有效的。现在,我必须将此功能扩展到其他视图(SecondListView、ThirdListView等),它们有自己的TreeView(内容的类型与FirstTreeView不同)。我怎么做?我应该把代码和命令放在哪里?1)正确的方式:
直接从公共抽象基类继承ViewModel类。参考此
2) 简单方法:
有一个单独的类命名,如“CommonViewModel”,并在其中包含公共代码。从CommonViewModel继承附加的ViewModel类
如下图所示
public class CommonViewModel
{
....
}
public class FirstViewModel:CommonViewModel
{
....
}
不要将业务逻辑放在ViewModels中。ViewModels应仅用于表示逻辑
创建一个
FamilyTreechSearchService
并将其功能抽象到此服务,然后将该服务注入到您的ViewModels(即构造函数、依赖项注入或ServiceLocator)中。从ViewModels调用服务。“SearchFamilityTreeCommand是从ICommand派生的类,execute方法调用函数来执行搜索。”这是单独编码的吗?如果是,我希望您可以在视图中单独使用它。这在FirstViewModel中显示。我想我最好也加上那个代码。你的意思是在基类中添加一个命令?但是我不能将命令绑定到基类,因为数据上下文将是派生类。无法对datacontext的父级进行绑定?1)所有ViewModel类都应继承该抽象类,以便它们分别包含命令。2) 这些命令的实现逻辑可以放在单独的类(甚至是服务)中,并且这些方法可以在每个ViewModel中访问。
public class CommonViewModel
{
....
}
public class FirstViewModel:CommonViewModel
{
....
}