在一个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不是一个好主意。