如何在不实例化新ViewModel的情况下设置BindingContext

时间:2018-12-19 10:13:23

标签: c# xaml mvvm xamarin.forms

我有一个带有图像的公共viewmodel和创建viewmodel时要订阅的事件。此事件侦听wifi连接的更改,并将图像更改为wifi打开或关闭图标。在连接到特定视图的另一个视图模型中,我想将图像绑定到公共视图模型中存在的图像。问题是,将此图像的绑定上下文设置为公共视图模型会实例化公共视图模型的另一个副本。现在,我有两个常见的视图模型,该事件触发两次,每个视图模型触发一次。如何防止这种情况发生?

编辑: 想要访问公共viewmodel中的图像的页面的绑定上下文是MyViewModel。图像的绑定上下文设置为通用视图模型,如下所示:

<Image
    Source="{Binding ConnectivityImageSource}">
    <Image.BindingContext>
        <connectivity:CommonViewModel />
    </Image.BindingContext>
</Image>

3 个答案:

答案 0 :(得分:1)

  

将此图像的绑定上下文设置为公共视图模型会实例化该公共视图模型的另一个副本

这是不正确的,如果使用一个视图模型,则只有一个实例。您需要传递它的引用并将其绑定到另一个视图,您显然不会这样做。很难说应该怎么做,因为有多种方法可以做到,但是这里有一个:

public class Page2: ContentPage
{
  public Page2(object viewModel)
  {
     BindingContext = viewModel;
  }
}

编辑:您已经相当多地更改了问题,但是答案本质上是相同的-您需要传递公共viewmodel的引用,而不是像执行操作一样两次对其进行初始化。同样,有多种方法可以执行此操作,您可以从上面的示例开始,然后不要将模型指定为整个视图的绑定上下文,而是将其分配为控件(如有必要)的绑定上下文。

答案 1 :(得分:0)

您可以使用单例模式或静态定义不两次启动视图模型。

以下是有关单例模式的来源:http://csharpindepth.com/articles/general/singleton.aspx

答案 2 :(得分:0)

尝试单例模式,下面的示例代码

您的视图模型构造函数应该是

public static SampleViewModel currentInstance;
    /// <summary>
    /// Currents the instance this view mode shared on two place.
    /// </summary>
    /// <returns>The instance.</returns>
    /// <param name="navigation">Navigation.</param>
    public static SampleViewModel CurrentInstance(INavigation navigation)
    {
        if (currentInstance == null)
            return currentInstance = new SampleViewModel(navigation);
        else
            return currentInstance;

    }

,绑定上下文后面的代码应该是

public SamplePage()
    {
        InitializeComponent();
        BindingContext = SampleViewModel.CurrentInstance(Navigation);

    }