MvvmCross Windows Store如何将不同的ViewModel绑定到Appbar?

时间:2014-06-22 17:07:16

标签: c# xaml mvvm windows-store-apps mvvmcross

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

因此,我使用3 View for这3个ViewModel for Windows Phone app。

然后,我想为Windows应用商店创建包含主详细信息视图的应用,并为这些ViewModel使用1视图。 我想在这里创建应用程序:

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

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

据我所知,我必须使用“自定义演示者”来显示1个View上3个ViewModel的数据。

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

MvvmCross控件导航插件在UserControls中放置了另外两个View。 我觉得,它很适合我,但我发现了一个问题(Windows Store应用程序中的Appbar)。

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

早期我通过删除/添加代码后面的按钮而没有任何ViewModel。

我可以举例说明Appbar动态变化取决于上下文: 适用于Windows应用商店平台的OneNote应用程序。

Appbar示例(链接):

OneNote Appbar1

OneNote Appbar2

OneNote Appbar3

OneNote Appbar4


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

如果是,那我怎么办呢?

你能暗示我,因为我找不到任何解决办法吗?

或者我必须为Windows应用商店应用创建一个页面导航(我不想这样做,因为我觉得这对我的应用来说不方便)?

或者我必须将appbar与一个(第一个加载的)ViewModel绑定(我想,这也不方便)?

我也尝试将Appbar放置为UserControl,但我不知道将它绑定到不同的ViewModel,或者如果我将它绑定到AppbarViewModel,我不知道热点通知其他人ViewModel。

无论如何都要提前感谢!


更新1

我尝试用Appbar解决我的问题,比如UserControl和AppbarViewModel。

此外,我尝试使用“MvvmCross Messenger插件”来通知其他ViewModels关于按钮事件的内容,该事件是在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的视图        在Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType)    在Cirrious.MvvmCross.WindowsStore.Views.MvxStoreViewPresenter.Show(MvxViewModelRequest request)

2)当我没有将AppbarControl放在Page.BottomAppBar中并将其放在如下页面中的其他位置时:

<controls:AppbarControl Grid.Row="2"></controls:AppbarControl>

然后它运行良好,但不方便控制IsOpen = true / false Appbar,当用户使用鼠标右键单击时。

如何克服这个问题?


已更新2

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

有关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的视图”消失。 如果我不使用IsSticky =“True”属性,则问题会再次出现。


提前致谢!

1 个答案:

答案 0 :(得分:1)

我通过更改Windows Store平台的“MvvmCross - Controls Navigation Plugin”源代码解决了这个问题。

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

我查了一下,似乎有效。

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

Source code on GitHub