我似乎找不到任何简单的例子。
我有一个WPF UI,我希望在另一个视图中将视图显示为子控件。 MvxWpfView
继承自UserControl
所以它应该是可能的,但我似乎无法弄清楚如何进行绑定。
我收到BindingExpression
路径错误,因为它在我的ParentViewModel中找不到ChildView属性。
那么如何绑定视图来控制内容?
答案 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方法中设置一个断点,这样你就可以了解它们是如何工作的 - 当你了解它们时它们非常简单,并且非常强大。