WinUI中如何在DataTemplate内x:Bind绑定XAML根对象成员?
问题解答
1. 不使用静态成员,在DataTemplate中访问Page类成员的正确方式
你遇到的第一个错误是因为x:Bind在DataTemplate中默认绑定上下文是x:DataType指定的Team实例,直接引用myPage会让编译器尝试在Team类中查找该属性;第二个错误则是DataTemplate复用控件时,通过x:Name引用的元素会被包装为WeakReference,无法直接强转为TeamsPage类型。
推荐用RelativeSource定位父级Page的方式,这是最直接可靠的解决方案:
<DataTemplate x:Name="myTemplate" x:DataType="models:Team"> <controls:StatisticCellControl StatisticsMode="{x:Bind RelativeSource.AncestorType=local:TeamsPage, Path=ViewModel.StatisticsModeViewModel.SelectedStatMode, Mode=OneWay}" /> </DataTemplate>
也可以将Page的ViewModel存入资源字典,再通过StaticResource绑定:
- 在Page的Resources中声明资源:
<Page.Resources> <local:TeamsPageViewModel x:Key="PageViewModel" /> </Page.Resources>
- 在Page后台代码构造函数/Loaded事件中赋值:
public TeamsPage() { this.InitializeComponent(); this.Resources["PageViewModel"] = ViewModel; }
- 在DataTemplate中绑定:
<DataTemplate x:Name="myTemplate" x:DataType="models:Team"> <controls:StatisticCellControl StatisticsMode="{x:Bind Source={StaticResource PageViewModel}, Path=StatisticsModeViewModel.SelectedStatMode, Mode=OneWay}" /> </DataTemplate>
2. 静态属性作为临时方案时,通知绑定更新的方法
如果用静态属性,需要通过静态PropertyChanged事件触发绑定更新,具体实现如下:
后台代码实现:
using System.ComponentModel; namespace PM.FantasyAdvisorNHL.Ui.Pages { public sealed partial class TeamsPage : Page { // 静态属性变更通知事件 public static event PropertyChangedEventHandler StaticPropertyChanged; private static StatMode _selectedStatMode; public static StatMode SelectedStatMode { get => _selectedStatMode; set { if (_selectedStatMode != value) { _selectedStatMode = value; OnStaticPropertyChanged(nameof(SelectedStatMode)); } } } // 触发静态属性变更通知 private static void OnStaticPropertyChanged(string propertyName) { StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); } // 其他业务代码... } }
XAML绑定静态属性:
<DataTemplate x:Name="myTemplate" x:DataType="models:Team"> <controls:StatisticCellControl StatisticsMode="{x:Bind local:TeamsPage.SelectedStatMode, Mode=OneWay}" /> </DataTemplate>
当SelectedStatMode静态属性值变化时,调用OnStaticPropertyChanged触发事件,绑定会自动重新计算并更新UI。
内容的提问来源于stack exchange,提问作者Bezousek
相关产品推荐
相关产品推荐

