如何基于多个ViewModel刷新StatusBar?

时间:2015-10-06 16:02:10

标签: windows-phone-8.1 viewmodel mvvm-light statusbar win-universal-app

我开发了通用应用,它使用 MVVM Light Navegar 。在此应用中,主页面包含数据透视,其中每个数据透视表都绑定到 ViewModel

此页面如下所示:

enter image description here

XAML看起来像这样:

    <Page
        ...>
        <Page.DataContext>
            <Binding Path="MainViewModelInstance" Source="{StaticResource Locator}"/>
        </Page.DataContext>
        <Page.Resources>
            ...
        </Page.Resources>
        <Grid>
            <!-- HOME -->
            <Pivot x:Uid="homePivot" 
                   x:Name="homePivot" 
                   CommonNavigationTransitionInfo.IsStaggerElement="True" 
                   TitleTemplate="{StaticResource AppPivotTitle}"
                   Style="{StaticResource CustomizedPivot}">
                <Pivot.Background>
                    <ImageBrush Stretch="Fill"/>
                </Pivot.Background>
                <PivotItem x:Uid="homePivotitemHome"
                           Margin="19,14.5,19,0"
                           CommonNavigationTransitionInfo.IsStaggerElement="True" 
                           Header="Home">
                    <PivotItem.Background>
                        <ImageBrush ImageSource="{Binding Infos.background_image, Converter={StaticResource InfosUIImageFondToStringConverter}}" 
                                    Stretch="UniformToFill" 
                                    Opacity="0.75"/>
                    </PivotItem.Background>
                    </PivotItem.ContentTemplate>
                </PivotItem>

                <!-- NEWS -->
                <PivotItem x:Uid="homePivotitemNews"
                           Margin="19,14.5,0,0"
                           CommonNavigationTransitionInfo.IsStaggerElement="True" >
                    <PivotItem.DataContext>
                        <Binding Path="NewsViewModel" Source="{StaticResource Locator}"/>
                    </PivotItem.DataContext>
                    <PivotItem.ContentTemplate>
                        <DataTemplate>
                            <Grid>
                                <ListView ItemsSource="{Binding News}"
                                          IsItemClickEnabled="True"
                                          SelectionMode="Single"
                                          ContinuumNavigationTransitionInfo.ExitElementContainer="True">
                                    ...
                                </ListView>
                            </Grid>
                        </DataTemplate>
                    </PivotItem.ContentTemplate>
                </PivotItem>

                <!-- CONTACTS -->
                <PivotItem x:Uid="homePivotitemContacts"
                           Margin="19,14.5,0,0"
                           CommonNavigationTransitionInfo.IsStaggerElement="True" 
                           Header="Contacts">
                    <PivotItem.DataContext>
                        <Binding Path="ContactsViewModel" Source="{StaticResource Locator}"/>
                    </PivotItem.DataContext>
                    <PivotItem.ContentTemplate>
                        <DataTemplate>
                            <Grid>
                                <ListView ItemsSource="{Binding Contacts}"
                                      IsItemClickEnabled="True"
                                      SelectionMode="Single"
                                      ContinuumNavigationTransitionInfo.ExitElementContainer="True">
                                    ...

                                </ListView>
                            </Grid>
                        </DataTemplate>
                    </PivotItem.ContentTemplate>
                </PivotItem>            
                ...
            </Pivot>
        </Grid>
    </Page>

因此该页面受限于 DataContext &#34; MainViewModelInstance &#34;,用于第一个PivotItem 其他PivotItems 拥有自己的 DataContext :&#34; NewsViemodel &#34;,&#34; ContactsViewModel &#34;,...

在每个 ViewModel 上,构造函数调用 L oad() 方法来更新此HomePage的数据。

我想在其中一个ViewModel正在加载数据时显示 StatusBarProgressIndicator ,并在加载所有数据时停止它。

目前,我显示 StatusBarProgressIndicatorby 调用&#34; ShowStatusBarProgress() &#34; &#34; MainViewModel &#34;中的方法:

    private async void LoadData()
    {
        ShowStatusbarProgress();
        // Load data
        ...
        HideStatusbarProgress();
    }

    private async void ShowStatusbarProgress()
    {
        progressbar.Text = "Please Wait...";
        await progressbar.ShowAsync();
    }

    private async void HideStatusbarProgress()
    {
        await progressbar.HideAsync();
    }

但我不知道如何考虑所有&#34; Load()&#34; ViewModels的方法。我听说过Messenger服务,但我不知道它在我的情况下是如何工作的。

0 个答案:

没有答案