我尝试绑定到 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 中的页面类访问某些内容?
如果我使用静态函数或静态属性作为页面代码后面的解决方法,我如何通知绑定某些内容已更改并且应该重新评估值?
谢谢。
在
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 设置为特定类型的父元素。