使用MessagingCenter在ViewModel与视图和导航之间进行通信

时间:2017-07-12 20:29:03

标签: c# xamarin mvvm xamarin.forms

在一个XAML页面(一个视图)中,我有一堆像Pickers一样绑定到ViewModel的控件,叫做“NegotiationVM”

例如,我有一个绑定到其中一个属性“NegotiatorSelected”的Picker,它返回一个对象“Negotiator”。 我的corcern是关于该谈判者选择器旁边的一对按钮,没有绑定到Negotiation ViewModel或任何Command,这些按钮用于添加或编辑谈判者。因为我正在尝试遵循MVVM模式(还没有框架......)我想知道这里的最佳做法是什么。

我的方法是在第一个ViewModel创建命令中,该命令调用将子ViewModel的实例发送到View的方法,因此当它接收它时,然后导航到子视图。

public class NegotiationVM: INotifyPropertyChanged{

  public NegotiationVM{
    AddNegotiatorCommand = new Command(AddNegotiator,()=> !IsBusy);
  }
...
  public void AddNegotiator(){
    negotiatorvm = new NegotiatiorVM(_client)
    MessagingCenter.Send<NegotiationVM,NegotiatorVM>(this,"NegotiatiorVM",negotiatiorvm)
  }
  public void EditNegotiator(){
    negotiatorvm = new NegotiatiorVM(_client,_negotiatior)
    MessagingCenter.Send<NegotiationVM,NegotiatorVM>(this,"NegotiatiorVM",negotiatiorvm)
  }
}

所以在NegotiationView中我这样做:

<!-- More controls binded to NegotiationVM -->
...
<!--  -->
<Picker x:Name="pickerNegotiator" Title="Select..." ItemsSource="{Binding Negotiatorsofthisnegotiation}" SelectedItem="{Binding SelectedNegotiator}" />
 <Button x:Name="btnAddNegotiator" Text="➕" BackgroundColor="#3276b1"  TextColor="White" HorizontalOptions="End" WidthRequest="35" Command="{Binding AddNegotiatorCommand}" />
<Button x:Name="btnEditNegotiator" Text="" BackgroundColor="#3276b1"  TextColor="White" HorizontalOptions="End" WidthRequest="35"  Command="{Binding EditNegotiatorCommand}" />
<!-- ... -->             

和代码隐藏:

...
public NegotiationView(){
   negotiationvm = new NegotiationVM();
   this.BindingContext = negotiationvm;
   MessagingCenter.Subscribe<NegotiationVM,NegociatorVM>(this,"NegotiatorVM",AddEditNegotiator);
}
...
void AddEditNegotiator(NegotiationVM arg1, NegotiatorVM vm)
        {
            NegotiatorPage negotiatorPage = new NegotiatorPage()
            {
                BindingContext = vm
            };
            Navigation.PushAsync(negotiatorPage);
        }

因此,使用MessagingCenter将ViewModel传递给View以将其绑定到子视图然后导航到其视图,考虑到我没有使用任何MVVM框架,这是一个很好的做法吗?这种方法是否使View中的ViewModel足够分离?我读到一些评论,使用MessagingCenter不是一个好主意。

0 个答案:

没有答案