Mono 从另一个Viewmodel为选项卡控件重新加载Viewmodel

Mono 从另一个Viewmodel为选项卡控件重新加载Viewmodel,mono,xamarin,mvvmcross,Mono,Xamarin,Mvvmcross,我已经创建了一个选项卡控件,如链接中所述 例如:我有两个选项卡视图模型“搜索和筛选”。 FilterViewModel:要在视图中绑定的国家/地区和州结果属性。 SearchViewModel:列出可由FilterViewModel中的选定筛选器查看的可用结果 如何从Filterviewmodel属性更改中更新Searchviewmodel SearchListing函数 编辑:我的样本核心功能与信使代码。但是错过了一些工作!请建议 public class SearchWOViewModel

我已经创建了一个选项卡控件,如链接中所述

例如:我有两个选项卡视图模型“搜索和筛选”。
FilterViewModel:要在视图中绑定的国家/地区和州结果属性。
SearchViewModel:列出可由FilterViewModel中的选定筛选器查看的可用结果

如何从Filterviewmodel属性更改中更新Searchviewmodel SearchListing函数

编辑:我的样本核心功能与信使代码。但是错过了一些工作!请建议

public class SearchWOViewModel  : MvxViewModel
{
    private readonly ISearchService _serachwo;
    private readonly IMvxMessenger _messenger;

    public SearchWOViewModel(ISearchService search, IMvxMessenger Messanger)
    {
        _serachwo = search;           
        Search = new SearchViewModel(_serachwo);
        Filter = new FilterViewModel(_serachwo, Search, Messanger);
    }
    private FilterViewModel _Filter;
    public FilterViewModel Filter { get { return _Filter; } set { _Filter = value; RaisePropertyChanged(() => Filter); } }

    private SearchViewModel _Search;
    public SearchViewModel Search { get { return _Search; } set { _Search = value; RaisePropertyChanged(() => Search); } }

}

public class FilterViewModel : MvxViewModel
{
    private readonly ISearchService _filterwo;
    private readonly IMvxMessenger messenger;
    private readonly MvxSubscriptionToken _token;

    public FilterViewModel(ISearchService search, SearchViewModel searchViewModel,IMvxMessenger _messenger)
    {
        _filterwo = search; messenger = _messenger;
        searchViewModel = SearchViewModel;
        SiteDropDown();         
        EquipmentDropDown();
    }

    public void SiteDropDown() { String query = "UserSite"; _filterwo.UserSite(query, result => { SiteResult = result; messenger.Publish(new UpdateSearchResultsMessage(this)); searchViewModel.SearchListingWO(); }, error => { }); }
    private List<DropDownEquipment> _siteresult;
    public List<DropDownEquipment> SiteResult { get { return _siteresult; } set { _siteresult = value; RaisePropertyChanged(() => SiteResult); } }

    public void EquipmentDropDown() { String query = "FillEquipment"; _filterwo.FillEquipment(query, result => { EquipmentResult = result; }, error => { }); }
    private List<DropDownEquipment> _EquipmentResults;
    public List<DropDownEquipment> EquipmentResult { get { return _EquipmentResults; } set { _EquipmentResults = value; RaisePropertyChanged(() => EquipmentResult); } }

    private DropDownEquipment _SelectedSite;
    public DropDownEquipment SelectedSite { get { return _SelectedSite; } set { _SelectedSite = value; RaisePropertyChanged(() => SelectedSite); } }
    private DropDownEquipment _SelectedEquipment;
    public DropDownEquipment SelectedEquipment { get { return _SelectedEquipment; } set { _SelectedEquipment = value; RaisePropertyChanged(() => SelectedEquipment); } }
}

public class SearchViewModel : MvxViewModel
{
    private readonly ISearchService _WorkOrder;
    public SearchViewModel(ISearchService search)
    {
        _WorkOrder = search;            
        SearchListingWO();
    }

    public void SearchListingWO() { String query = "WORKORDER"; _WorkOrder.Listingwo(query, result => Results = result, error => { }); }
    private List<ListingWo> _results;
    public List<ListingWo> Results { get { return _results; } set { _results = value; RaisePropertyChanged(() => Results); } }

    private ListingWo _SelectedWO;
    public ListingWo SelectedWO { get { return _SelectedWO; } set { _SelectedWO = value; RaisePropertyChanged(() => SelectedWO); } }
}

public class UpdateSearchResultsMessage : MvxMessage
{
    public UpdateSearchResultsMessage(object sender) : base(sender) { }
}
公共类SearchWOViewModel:MvxViewModel
{
私人只读ISearchService_serachwo;
专用只读IMvxMessenger\u messenger;
公共搜索WOViewModel(ISearchService搜索,IMVX Messenger Messenger)
{
_serachwo=搜索;
搜索=新的SearchViewModel(_serachwo);
Filter=新的FilterViewModel(\u serachwo,Search,Messanger);
}
私有过滤器模型过滤器;
公共FilterServiceModelFilter{get{return}Filter;}set{U Filter=value;RaisePropertyChanged(()=>Filter);}
private SearchViewModel\u搜索;
公共搜索视图模型搜索{get{return}Search;}set{{u Search=value;RaisePropertyChanged(()=>Search);}
}
公共类FilterViewModel:MvxViewModel
{
私有只读ISearchService_filterwo;
专用只读IMvxMessenger messenger;
私有只读MvxSubscriptionToken(令牌);
公共过滤服务模型(ISearchService搜索、SearchViewModel搜索视图模型、IMvxMessenger\u messenger)
{
_filterwo=搜索;messenger=\u messenger;
searchViewModel=searchViewModel;
SiteDropDown();
设备下拉列表();
}
public void SiteDropDown(){String query=“UserSite”;\u filterwo.UserSite(查询,结果=>{SiteResult=result;messenger.Publish(新更新搜索结果消息(this));searchViewModel.SearchListingWO();},错误=>{})
私有列表_sitesult;
公共列表SiteResult{get{return}SiteResult;}set{{SiteResult=value;RaisePropertyChanged(()=>SiteResult);}
public void EquipmentDropDown(){String query=“FillEquipment”\u filterwo.FillEquipment(查询,结果=>{EquipmentResult=result;},错误=>{});}
私有列表(设备结果);;
公共列表设备结果{get{return}EquipmentResults;}set{EquipmentResults=value;RaisePropertyChanged(()=>EquipmentResult);}
专用下拉设备\u选择的站点;
公共下拉设备SelectedSite{get{return{U SelectedSite;}设置{U SelectedSite=value;RaisePropertyChanged(()=>SelectedSite);}
私人下拉设备(u选择的设备);
公共下拉列表设备SelectedEquipment{get{return{U SelectedEquipment;}set{U SelectedEquipment=value;RaisePropertyChanged(()=>SelectedEquipment);}
}
公共类SearchViewModel:MvxViewModel
{
专用只读ISearchService\u工作订单;
公共搜索视图模型(ISearchService搜索)
{
_工作顺序=搜索;
SearchListingWO();
}
public void SearchListingWO(){String query=“WORKORDER”;\u WORKORDER.Listingwo(查询,结果=>Results=result,错误=>{});}
私人名单(结果);;
公共列表结果{get{return}Results;}set{{u Results=value;RaisePropertyChanged(()=>Results);}
私有列表WO _选择WO;
公共列表wo SelectedWO{get{return}set{u SelectedWO=value;RaisePropertyChanged(()=>SelectedWO);}
}
公共类UpdateSearchResultsMessage:MvxMessage
{
public UpdateSearchResultsMessage(对象发送方):基(发送方){}
}
请参考中的示例代码
. 请建议/指导如何传递数据。

我认为您所问的基本上是如何在视图模型之间进行通信。 有几种方法可以做到这一点:

1.您可以拥有一条自定义消息,并从FilterViewModel发送该消息以通知SearchViewModel。 请看这里的示例:

  public SearchWOViewModel()
    {
        Search = new SearchViewModel(_serachwo);
        Filter = new FilterViewModel(_serachwo, Search);
    }

public class FilterViewModel : MvxViewModel
{
   public FilterViewModel(ISearchWOService search, SearchViewModel searchViewModel)
   {
      _filterwo = search;
      searchViewModel = SearchViewModel;
      SiteDropDown();
   }

    public void SiteDropDown()
    {
       String query = "UserSite";
      _filterwo.FillUserSite(query, result => { SiteResult = result; searchViewModel.SearchListingWO(); }, error => { });
    }
}

在您的情况下,会有一个UpdateSearchResultsMessage,如

public class UpdateSearchResultsMessage : MvxMessage
{
     public UpdateSearchResultsMessage(object sender) : base(sender) {}
}
您将通过SiteDropDown()方法发送此消息:

一般性意见: 我不知道你的应用程序是如何工作的,但可能会考虑使用两个视图模型而不是一个视图模型SkieView模型,它既搜索又过滤用户站点。
但是,两个视图模型中的功能可能比您展示的要多得多,在这种情况下,可能需要进行分离。

如何在选项卡功能中使用单视图模型来实现上述功能。我已经为您提供了两种解决方案。首先使用其中一个。然后你可以考虑重构你的代码。对于一个视图模型,你只需要将代码从两个视图模型移动到这个视图模型。相同的代码,相同的属性。好的,我将使用上面提到的方法并让您知道。谢谢。我使用过一个视图模型,它既可以搜索也可以过滤。我的问题是:Android不显示SearchView的输出。如何为多视图设置单视图模型?仅供参考:请参考我的安卓标签家长示例代码。
  public SearchWOViewModel()
    {
        Search = new SearchViewModel(_serachwo);
        Filter = new FilterViewModel(_serachwo, Search);
    }

public class FilterViewModel : MvxViewModel
{
   public FilterViewModel(ISearchWOService search, SearchViewModel searchViewModel)
   {
      _filterwo = search;
      searchViewModel = SearchViewModel;
      SiteDropDown();
   }

    public void SiteDropDown()
    {
       String query = "UserSite";
      _filterwo.FillUserSite(query, result => { SiteResult = result; searchViewModel.SearchListingWO(); }, error => { });
    }
}