从另一个ViewModel Xamarin.Forms更新ViewModel

时间:2017-04-21 09:18:47

标签: c# xamarin xamarin.android xamarin.forms

我正在开发一个Xamari.Forms应用程序,其中我有一个 MainPageView.Xaml MainPageViewModel.cs ,我也在MainPageView.Xaml里面有stackLayout,其中我&# 39; m动态加载视图(绑定到另一个视图模型)。我必须在第二个ViewModel中更新一些值,当在 MainPageViewModel.cs 中有一些更改时,它会绑定到视图。我现在正在使用Messaging Center,但每次我都无法使用Messaging center,因为我必须取消订阅,否则会多次调用它。是否有任何优化的方法可以从另一个视图模型中调用和更新一个视图模型而无需离开屏幕。

2 个答案:

答案 0 :(得分:1)

这是一种替代方法,我只提出这个问题,因为你提到你使用的是MessagingCenter但是因为你收到了多个事件而停止了。在下面的答案中,我描述了一种简单的方法,您可以轻松订阅和取消订阅视图模型中的事件: Object disposing in Xamarin.Forms

基本上我正在构建一些基础架构,以便ViewModel知道它何时出现(订阅事件)并消失(取消订阅事件),这可以确保您没有多个视图实例内存中的模型可能会导致你看到的多个事件。

答案 1 :(得分:0)

您可以做的是创建一个ContentView来自您MainPageView.xaml,并将ViewModel称为BindingContext

例如:

OtherView.xaml

<ContentView>
    <StackLayout>
        <Label Text="{Binding MyText}" />
    </StackLayout>
</ContentView>

OtherViewModel.cs

public class OtherViewModel : INotifyPropertyChanged
{
    // Do you own implementation of INotifyPropertyChanged

    private string myText;
    public string MyText
    {
       get { return this.myText; }
       set
       {
           this.myText = value;
           this.OnPropertyChanged("MyText");
       }
    }

    public OtherViewModel(string text)
    {
        this.MyText = text;
    }
}

MainViewModel.cs

public class MainViewModel: INotifyPropertyChanged
{
    // Do you own implementation of INotifyPropertyChanged

    private OtherViewModel otherVM;
    public OtherViewModel OtherVM
    {
       get { return this.otherVM; }
    }

    public MainViewModel()
    {
        // Initialize your other viewmodel
        this.OtherVM = new OtherViewModel("Hello world!");
    }
}

MainPageView.xaml绑定到MainViewModel

<Page ....>
    <Grid>
        <!-- You have stuff here -->
        <OtherView BindingContext="{Binding OtherVM}" />
    </Grid>
</Page>

使用此方法,您可以使用所需的绑定上下文显示自定义视图。

PS:这个代码还没有经过测试,它只是纯粹的理论。

希望它有所帮助。