问题描述
.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>
看起来像:
背后的代码是:
public sealed partial class PrincipalPage : Page
{
// Reference to our view model.
public Principalviewmodel viewmodel { get; set; }
public PrincipalPage()
{
this.InitializeComponent();
this.viewmodel = new Principalviewmodel();
}
}
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 (将#修改为@)