如何在 WinUI 中从 DataTemplate 绑定到 xaml 根对象的成员?

问题描述 投票:0回答:1

我尝试绑定到 DataTemplate 中我的页面的成员。

根据此,应该可以将 Page 转换为我的自定义类型。 https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension#casting

DataTemplate 中的绑定首先采用 DataTemplate 类型,但我也可以使用 xaml 树中的元素名称,如上面的文章所述。

尽管如此,我的根元素是 Page,我需要将其转换为我的自定义类型。

参见第一个示例:

<Page x:Class="PM.FantasyAdvisorNHL.Ui.Pages.TeamsPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:controls="using:PM.FantasyAdvisorNHL.Ui.Controls"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="using:PM.FantasyAdvisorNHL.Ui.Pages"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:models="using:PM.FantasyAdvisorNHL.Core.Models" x:Name="myPage"
      Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
      mc:Ignorable="d">
    <Page.Resources>
        <DataTemplate x:Name="myTemplate" x:DataType="models:Team">
            <controls:StatisticCellControl StatisticsMode="{x:Bind myPage.ViewModel.StatisticsModeViewModel.SelectedStatMode, Mode=OneWay}" />
        </DataTemplate>
    </Page.Resources>

</Page>

这将生成错误 WMC1110:无效的绑定路径“myPage.ViewModel.StatisticsModeViewModel.SelectedStatMode”:在类型“Page”上找不到属性“ViewModel”。

另一个示例代码:

 <DataTemplate x:Name="myTemplate" x:DataType="models:Team">
     <controls:StatisticCellControl StatisticsMode="{x:Bind ((local:TeamsPage)myPage).ViewModel.StatisticsModeViewModel.SelectedStatMode, Mode=OneWay}" />
 </DataTemplate>

这将生成错误 CS1503:参数 1:无法从 'System.WeakReference' 转换为 'Microsoft.UI.Xaml.Controls.Page'

那么如何在不使用 static 的情况下从 DataTemplate 中的页面类访问某些内容?

如果我使用静态函数或静态属性作为页面代码后面的解决方法,我如何通知绑定某些内容已更改并且应该重新评估值?

谢谢。

c# xaml datatemplate winui xbind
1个回答
0
投票

DataTemplate
属性设置为
x:DataType
models:Team
内,只能使用
x:Bind
绑定到
models:Team
类的成员。您不能使用已编译的绑定来绑定到任何其他类型或元素的属性,包括父级
Page

您可以使用

{Binding}
语法来使用未编译的绑定:

<Page x:Class="PM.FantasyAdvisorNHL.Ui.Pages.TeamsPage"
      ...
      Name="page">
    <Page.Resources>
        <DataTemplate x:Name="myTemplate" x:DataType="models:Team">
            <controls:StatisticCellControl
                StatisticsMode="{Binding ViewModel.StatisticsModeViewModel.SelectedStatMode,
                    ElementName=page}" />
        </DataTemplate>
    </Page.Resources>

</Page>

或者您可以尝试建议的解决方法,使用附加属性将目标元素的 DataContext 设置为特定类型的父元素。

© www.soinside.com 2019 - 2024. All rights reserved.