UWP - x:Bind 和 Binding - AdaptativeGridView 内的 FlipView - 仅使用 x:Bind

问题描述

.NET 生态系统的新手。

以下代码在空白 UWP 应用中遵循 MVVM 运行良好。

<Page
    x:Class="UWP.Blank.Mvvm.App01.Views.PrincipalPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWP.Blank.Mvvm.App01"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
    xmlns:md="using:UWP.Blank.Mvvm.App01.Models"
    xmlns:vm="using:UWP.Blank.Mvvm.App01.viewmodels"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    x:Name="ThisPrincipalPage">

    <Page.Resources>



        <DataTemplate x:Name="FlipView_ItemTemplate" x:DataType="md:MyFlipViewItem">
            <Grid>
                <Image Source="{x:Bind ImageLocation}" Stretch="Uniform" HorizontalAlignment="Center"/>
            </Grid>
        </DataTemplate>

        <DataTemplate x:Key="AdaptativeGridView_ItemTemplate">
            <Grid
                Background="White"
                BorderBrush="Black"
                BorderThickness="1">

                <FlipView Width="300" Height="300"
                          ItemTemplate="{StaticResource FlipView_ItemTemplate}"
                          ItemsSource="{Binding ElementName=ThisPrincipalPage,Path=viewmodel.FlipViewData}"/>


            </Grid>
        </DataTemplate>

    </Page.Resources>

    <Grid>

        <controls:AdaptiveGridView x:Name="AdapGridView1"
                                   ItemsSource="{x:Bind Path=viewmodel.AdaptativeGridViewData}"
                                   ItemTemplate="{StaticResource AdaptativeGridView_ItemTemplate}"/>


    </Grid>

</Page>

看起来像:

enter image description here

背后的代码是:


    public sealed partial class PrincipalPage : Page
    {

        // Reference to our view model.
        public Principalviewmodel viewmodel { get; set; }



        public PrincipalPage()
        {
            this.InitializeComponent();
            this.viewmodel = new Principalviewmodel();
        }


    }

viewmodel 是这个类的一个实例:

    public class Principalviewmodel
    {


        public ObservableCollection<int> AdaptativeGridViewData { get; set; } = new ObservableCollection<int>() { 1,2,3,4 };
        public ObservableCollection<MyFlipViewItem> FlipViewData { get; set; } = new ObservableCollection<MyFlipViewItem>();

...

}

它提供了两个列表,一个用于 AdaptativeGridView 控件,另一个用于其中的所有 FlipView。

我的问题是,有什么办法可以只使用 x:Bind? 基本上,因为它声称速度更快。如果不可能,x:Bind 不能替代 Binding,这会让一切变得更加混乱。

我尝试了两种基本的“直观选项”,但都行不通。

选项 1,其中 FlipView 的 ItemsSource 属性更改为使用 x:Bind。错误声明:

绑定路径“viewmodel.FlipViewData”无效:在“DataTemplate”类型上找不到属性viewmodel”。

似乎 FlipView 的 DataTemplate 的 DataContext 与预期不同。也许 DataContext 指向 viewmodel.AdaptativeGridViewData,但是,谁知道呢?它是 XAML。这是我发现 XAML 不方便的原因之一,因为它的行为就像一个“黑匣子”。您知道如何做某事或遇到麻烦。

在这种情况下,我尝试使用带有“FindAncestor”实用程序的经典绑定来指向 viewmodel。但是,在 UWP 中,未实现 AncestorType。

(即,类似 --> ItemsSource="{Binding FlipViewData,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type AdaptativeGridView}}}" )

        <DataTemplate x:Key="AdaptativeGridView_ItemTemplate">
            <Grid
                Background="White"
                BorderBrush="Black"
                BorderThickness="1">

                <FlipView Width="300" Height="300"
                          ItemTemplate="{StaticResource FlipView_ItemTemplate}"
                          ItemsSource="{x:Bind Path=viewmodel.FlipViewData}"/>


            </Grid>
        </DataTemplate>

我很好奇,因为我没有在 DataTemplate 中明确设置 x:DataType。那么,为什么 DataContext 与 AdaptativeGridView 或 Page 中的任何“正常”控件都不相同?

选项 2,它明确设置了 DataTemplate 的 x:DataType(注意这确实在另一个 DataTemplate“FlipView_ItemTemplate”中起作用)。但是,对于“AdaptativeGridView_ItemTemplate”,存在运行时错误

抛出异常:UWP.Blank.Mvvm.App01.exe 中的“system.invalidCastException”

没有更多线索。

        <DataTemplate x:Key="AdaptativeGridView_ItemTemplate" x:DataType="vm:Principalviewmodel">
            <Grid
                Background="White"
                BorderBrush="Black"
                BorderThickness="1">

                <FlipView Width="300" Height="300"
                          ItemTemplate="{StaticResource FlipView_ItemTemplate}"
                          ItemsSource="{x:Bind FlipViewData}"/>


            </Grid>
        </DataTemplate>

欢迎任何经验或建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)