MVVMCross - 在视图中显示视图

时间:2014-05-22 04:09:54

标签: mvvmcross

我似乎找不到任何简单的例子。

我有一个WPF UI,我希望在另一个视图中将视图显示为子控件。 MvxWpfView继承自UserControl所以它应该是可能的,但我似乎无法弄清楚如何进行绑定。

我收到BindingExpression路径错误,因为它在我的ParentViewModel中找不到ChildView属性。

那么如何绑定视图来控制内容?

1 个答案:

答案 0 :(得分:2)

首先,您可能只需要将要在AView上显示的BViewModel添加为ViewModelA上的属性

E.g。

public class AViewModel: MvxViewModel
{
    public BViewModel ChildViewModel 
    {
        get;set;//With appropriate property changed notifiers etc.
    }
}

然后在AView中你只需添加一个BView,你可以按如下方式设置BView的datacontext:

<UserControlB DataContext="{Binding ChildViewModel}"/>

但是,如果您想要更灵活的东西(并且您希望不同平台处理不同的演示文稿),那么您将需要使用自定义演示者

在setup.cs中覆盖CreateViewPresenter:

    protected override IMvxWpfViewPresenter CreateViewPresenter(Frame rootFrame)
    {
        return new CustomPresenter(contentControl); 
    }

现在创建您需要从现有演示者继承的类CustomPresenter。你可以选择它可能已经使用SimpleWpfPresenter之间的那个,或者你可能想要更多地回到基础并使用abstract implementation

演示者的工作是采取您要求它呈现的视图模型,并以“某种方式”显示它。通常,这意味着识别匹配的视图,并将两者绑定在一起。

在您的情况下,您要做的是拍摄现有视图,并将其中的一部分绑定到第二种视图模式。

这显示了我在WinRT中的表现 - 但这个想法非常相似!

    public override void Show(MvxViewModelRequest request)
    {
        if (request.ViewModelType == typeof (AddRoomViewModel))
        {
            var loader = Mvx.Resolve<IMvxViewModelLoader>();
            var vm = loader.LoadViewModel(request, new MvxBundle());
            if (_rootFrame.SourcePageType == typeof (HomeView))
            {
                HomeView view = _rootFrame.Content as HomeView;
                view.ShowAddRoom(vm);
            }
        }
        else
        {
            base.Show(request);
        }
    }

所以我正在做的就是如果你想让我呈现ViewModel AddRoom,我会引用HomeView,然后我将把ViewModel直接传递给视图。

在HomeView内部我只需设置数据上下文,并执行我可能需要做的任何视图逻辑(例如现在可以看到某些内容)

internal void ShowAddRoom(Cirrious.MvvmCross.ViewModels.IMvxViewModel vm)         {             AddRoomView.DataContext = vm;         }

希望这是有道理的!非常值得在演示者的show方法中设置一个断点,这样你就可以了解它们是如何工作的 - 当你了解它们时它们非常简单,并且非常强大。