我使用3个ViewModel:文件夹,文件夹和项目(文件夹中的文件夹和文件夹中的项目)。

因此,我将3 View用于Windows Phone应用程序的这3个ViewModel。

然后,我想为Windows应用商店创建具有主详细信息 View 的应用程序,并为那些ViewModel使用1 View 。
我想像这里创建应用程序:

1)http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh758322.aspx);

2)与Microsoft的OneNote和Mail Windows Store应用类似。

我了解,我必须使用“自定义演示者”在1个 View 上显示3个ViewModels中的数据。

因此,我尝试使用“MvvmCross-控件导航插件”(https://github.com/ChristianRuiz/MvvmCross-ControlsNavigation)。

MvvmCross控件导航插件在UserControls中放置了另外2个 View 。
虽然可以,但我发现了一个问题(Windows Store应用中的Appbar)。

Appbar必须根据用户选择的部分更改按钮。
因此,我需要动态更改它并绑定(bind)到不同的ViewModel,这取决于contecst(用户单击)。

早些时候,我通过删除/添加按钮来实现此目的,而无需使用任何ViewModel。

我可以举一个Appbar示例,它根据上下文动态变化:
Windows Store平台的OneNote应用程序。

应用栏示例(链接):

OneNote Appbar1

OneNote Appbar2

OneNote Appbar3

OneNote Appbar4

是否可以使用mvvmcross创建主要详细信息应用程序?

如果是,那我该怎么办?

您能提示我,因为我找不到任何解决方案吗?

还是我必须为Windows Store应用程序创建一页导航(我不想这样做,因为我认为这对我的应用程序不方便)?

或者我必须仅将appbar与一个(首先加载的)ViewModel绑定(bind)(我认为这也不方便)?

我也曾尝试将Appbar像UserControl一样放置,但不知道将其绑定(bind)到其他ViewModel还是很热,如果我将其绑定(bind)到AppbarViewModel,也不知道会通知其他ViewModel。

还是要提前谢谢!

更新了1

我试图用UserControl和AppbarViewModel之类的Appbar解决我的问题。

我也尝试使用“MvvmCross Messenger插件”来通知其他ViewModel有关按钮事件的信息,该事件在appbar中引发。

链接到MvvmCross Messenger插件:
https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger

现在,我再次遇到Page.BottomAppBar的问题。

我创建AppbarControl和AppbarViewModel。

1)当我将AppbarControl放在Page.BottomAppBar中时:

<Page.BottomAppBar>
    <AppBar>
        <controls:AppbarControl></controls:AppbarControl>
    </AppBar>
</Page.BottomAppBar>

我收到这样的错误:

导航到AppbarViewModel的请求期间看到的错误-错误KeyNotFoundException:找不到PortableTasks.ViewModels.AppbarViewModel的 View
在Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType)
在Cirrious.MvvmCross.WindowsStore.Views.MvxStoreViewPresenter.Show(MvxViewModelRequest请求)

2)当我不将AppbarControl放在Page.BottomAppBar中并将其放在这样的页面中的其他位置时:
<controls:AppbarControl Grid.Row="2"></controls:AppbarControl>

然后它可以正常工作,但是当用户使用鼠标右键单击时,控制IsOpen = true/false Appbar并不方便。

如何克服这个问题?

更新了2

我几乎用AppBar的IsOpen =“True”和IsSticky =“True”属性解决了AppBar的问题。

有关此处的IsSticky属性的更多信息:issticky

XAML代码如下:
<Page.BottomAppBar>
    <AppBar IsOpen="True" IsSticky="True">
         <controls:AppbarControl></controls:AppbarControl>
    </AppBar>
</Page.BottomAppBar>

其中AppbarControl是:
<controls:MvxStoreControl xmlns:controls="using:MupApps.MvvmCross.Plugins.ControlsNavigation.WindowsStore">
    <Grid >
        <StackPanel Orientation="Horizontal">
                <AppBarButton/>
                <AppBarButton/>
        </StackPanel>
    </Grid>
</controls:MvxStoreControl>

另外,我更改了“MvvmCross-控件导航插件”的一些源代码。
改进之后,错误“找不到AppbarViewModel的 View ”消失了。
如果我不使用IsSticky =“True”属性,问题将再次出现。

提前致谢!

最佳答案

我通过更改Windows Store平台的“MvvmCross-控件导航插件”的源代码解决了此问题。

  • 我为4个控件(文件夹,文件夹,邮件和设置ViewModel)创建1个FirstViewModel和4个ViewModel。
  • 然后将所有与FirstViewModel相对应的控件放在FirstView中。
  • 我还创建了3个AppbarControl,它们对应于上面定义的3个ViewModel(文件夹,文件夹和邮件ViewModel)。
  • 然后,我将3个AppbarControl绑定(bind)到3个ViewModels(文件夹,文件夹和邮件ViewModel),因此,如果我单击AppbarControl中的一个按钮,对应的ViewModel将处理命令。
  • 我在Bottum.Appbar中放入了3个AppbarControl。
  • 我控制必须通过“事件”(例如鼠标单击)在FirstViewModel中通过AppbarControl的Visibility属性显示哪个AppbarControl。

  • 我检查了一下,看来还行。

    我想听听任何改进或替代方法。

    Source code on GitHub

    关于c# - MvvmCross Windows Store如何将不同的ViewModel绑定(bind)到Appbar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24353609/

    10-14 07:14