You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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绑定:

  1. 在Page的Resources中声明资源:
<Page.Resources>
    <local:TeamsPageViewModel x:Key="PageViewModel" />
</Page.Resources>
  1. 在Page后台代码构造函数/Loaded事件中赋值:
public TeamsPage()
{
    this.InitializeComponent();
    this.Resources["PageViewModel"] = ViewModel;
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:33:13