none
Pivot Items mit MVVM ViewModels RRS feed

  • Frage

  • Wenn ich PivotItems erstelle ist ja am Ende alles in einem XAML. Einmal ist das an sich nicht ganz so schön.

    Ein weiteres Problem das ich damit habe ist, dass ich verschiedene ViewModels für die PivotItem Seiten habe und wenn ich den DataContext direkt im <PivotItem> definiere, scheint der nicht initialisiert zu werden. Die BottomAppBar macht da auch Probleme (weil sie ja nicht mehr im <PivotItem> Scope ist)

    Hat jemand Vorschläge/Lösungen dazu? Ich finde leider nicht viel dazu im Internet.

    Edit: Hier ist ein BeispielCode

    <Page<Page
        x:Class="Project.Views.LinkListView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Melicious.Views"
    	xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
    	xmlns:core="using:Microsoft.Xaml.Interactions.Core"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    
        <Grid>
        	<Pivot Title="{StaticResource AppName}">
        		<PivotItem DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=Links}">
        			<ListView>
        				...
        			</ListView>
        		</PivotItem>
    
        		<PivotItem DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=Tags}">
        			<ListView>
        				...
        			</ListView>
        		</PivotItem>
        	</Pivot>
        </Grid>
    
        <Page.BottomAppBar>
    		<CommandBar>
    			<CommandBar.PrimaryCommands>
    				// here i would need different buttons depending on active pivot item
    				// also how can i call commands if this is not in the scope of the pivotitem's datacontext?
    			</CommandBar.PrimaryCommands>
    			<CommandBar.SecondaryCommands>
    				<AppBarButton x:Uid="logoutButton" Command="{Binding Logout}" />
    			</CommandBar.SecondaryCommands>
    		</CommandBar>
    	</Page.BottomAppBar>
    
    </Page>

    • Bearbeitet dnano01 Sonntag, 21. Dezember 2014 09:06
    Samstag, 20. Dezember 2014 19:55

Antworten

  • Hallo,

    Wenn ich PivotItems erstelle ist ja am Ende alles in einem XML

    Meinst du vielleicht den XAML Code? Das ist nun mal der Designcode in dem die gesamte (starre) UI entsteht. Das kannst du nicht ändern.

    Ein weiteres Problem das ich damit habe ist, dass ich verschiedene ViewModels für die PivotItem Seiten habe und wenn ich den DataContext direkt im <pivotitem>definiere, scheint der nicht initialisiert zu werden. </pivotitem>

    Das kann ich nicht nachvollziehen. Ich habe das eben mal getestet und hatte keine Probleme.

    Die BottomAppBar macht da auch Probleme (weil sie ja nicht mehr im <pivotitem>Scope ist)</pivotitem>

    Auch hier verstehe ich nicht so wirklich was du meinst. Ja, gemeinsam haben PivotItem und AppBar maximal die Page, das ist aber immer so. Egal was du verwendest.

    Alles in Allem wäre es gut, wenn du genauer beschreibst was du meinst und auch ein Beispielprojekt zeigst, bei dem die Fehler auftreten. Lade das Projekt ggf. auf OneDrive o.ä. hoch.

    Ich habe für meinen Test folgenden Code verwendet:

    <Page
        x:Class="App169.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App169"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Page.BottomAppBar>
            <CommandBar>
                <AppBarButton Content="B1"/>
                <AppBarButton Content="B2"/>
            </CommandBar>
        </Page.BottomAppBar>
        <Grid>
            <Pivot>
                <PivotItem DataContext="{Binding A}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="29*"/>
                            <RowDefinition Height="173*"/>
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Left" Margin="29,28,0,0" TextWrapping="Wrap" Text="{Binding Test}" VerticalAlignment="Top"/>
                    </Grid>
                </PivotItem>
                <PivotItem DataContext="{Binding B}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="29*"/>
                            <RowDefinition Height="173*"/>
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Left" Margin="29,28,0,0" TextWrapping="Wrap" Text="{Binding Test}" VerticalAlignment="Top"/>
                    </Grid>
                </PivotItem>
            </Pivot>
        </Grid>
    </Page>

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.A = new { Test = "A" };
            this.B = new { Test = "B" };
            this.DataContext = this;
            this.InitializeComponent();
    
            this.NavigationCacheMode = NavigationCacheMode.Required;
        }
    
        public object A { get; set; }
        public object B { get; set; }
    }


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 20. Dezember 2014 20:09

Alle Antworten

  • Hallo,

    Wenn ich PivotItems erstelle ist ja am Ende alles in einem XML

    Meinst du vielleicht den XAML Code? Das ist nun mal der Designcode in dem die gesamte (starre) UI entsteht. Das kannst du nicht ändern.

    Ein weiteres Problem das ich damit habe ist, dass ich verschiedene ViewModels für die PivotItem Seiten habe und wenn ich den DataContext direkt im <pivotitem>definiere, scheint der nicht initialisiert zu werden. </pivotitem>

    Das kann ich nicht nachvollziehen. Ich habe das eben mal getestet und hatte keine Probleme.

    Die BottomAppBar macht da auch Probleme (weil sie ja nicht mehr im <pivotitem>Scope ist)</pivotitem>

    Auch hier verstehe ich nicht so wirklich was du meinst. Ja, gemeinsam haben PivotItem und AppBar maximal die Page, das ist aber immer so. Egal was du verwendest.

    Alles in Allem wäre es gut, wenn du genauer beschreibst was du meinst und auch ein Beispielprojekt zeigst, bei dem die Fehler auftreten. Lade das Projekt ggf. auf OneDrive o.ä. hoch.

    Ich habe für meinen Test folgenden Code verwendet:

    <Page
        x:Class="App169.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App169"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Page.BottomAppBar>
            <CommandBar>
                <AppBarButton Content="B1"/>
                <AppBarButton Content="B2"/>
            </CommandBar>
        </Page.BottomAppBar>
        <Grid>
            <Pivot>
                <PivotItem DataContext="{Binding A}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="29*"/>
                            <RowDefinition Height="173*"/>
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Left" Margin="29,28,0,0" TextWrapping="Wrap" Text="{Binding Test}" VerticalAlignment="Top"/>
                    </Grid>
                </PivotItem>
                <PivotItem DataContext="{Binding B}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="29*"/>
                            <RowDefinition Height="173*"/>
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Left" Margin="29,28,0,0" TextWrapping="Wrap" Text="{Binding Test}" VerticalAlignment="Top"/>
                    </Grid>
                </PivotItem>
            </Pivot>
        </Grid>
    </Page>

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.A = new { Test = "A" };
            this.B = new { Test = "B" };
            this.DataContext = this;
            this.InitializeComponent();
    
            this.NavigationCacheMode = NavigationCacheMode.Required;
        }
    
        public object A { get; set; }
        public object B { get; set; }
    }


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 20. Dezember 2014 20:09
  • Hab meine Frage um den Code ergänzt. Bei der CommandBar habe ich das Problem, dass je nach PivotItem und ob Elemente in der jeweiligen Liste ausgewählt sind andere AppButtons angezeigt werden sollen.
    Sonntag, 21. Dezember 2014 09:08