UWP x:Bind绑定Application.Current提示找不到Application属性如何解决
问题根因
你遇到的两类报错核心原因如下:
- XAML绑定报错:
x:Bind的默认上下文是当前页面的后台类(即MainPage),直接写{x:Bind Application.Current}会默认查找MainPage下的Application属性,自然不存在。 - CS1061报错:
Application.Current返回的是Windows.UI.Xaml.Application基类实例,你自定义的IsSignedIn是在子类App中定义的,基类没有该属性,直接调用肯定报错。
解决方案
方案1:直接绑定App实例(最简修改,无需额外ViewModel)
- 先在
App.xaml中注册布尔转可见性的转换器,XAML中bool类型无法直接赋值给Visibility属性,需要转换器中转:
<Application.Resources> <BooleanToVisibilityConverter x:Key="BoolToVisConverter"/> </Application.Resources>
- 在
MainPage.xaml头部声明App类所在的命名空间,示例如下(替换成你自己的App类命名空间即可):
xmlns:local="using:MSGraphAPIDemo"
- 修改StackPanel的绑定逻辑:
<StackPanel Visibility="{Binding Path=IsSignedIn, Source={x:Static local:App.Current}, Converter={StaticResource BoolToVisConverter}}"> <!-- 内部按钮代码保持不变 --> </StackPanel>
该方案直接绑定你自定义的App类全局实例,你已经在App类中实现了INotifyPropertyChanged,IsSignedIn变化时会自动通知界面更新。
方案2:配合你已创建的MainPageViewModel使用
你当前的ViewModel存在两个问题:没有实现属性变更通知、只在构造函数赋值一次无法同步后续状态,修改后代码如下:
using System.ComponentModel; using System.Runtime.CompilerServices; using Windows.UI.Xaml; namespace MSGraphAPIDemo.Model { public class MainPageViewModel : INotifyPropertyChanged { // 直接绑定App实例的IsSignedIn,避免重复存值 public bool SignedIn => ((App)Application.Current).IsSignedIn; public MainPageViewModel() { // 订阅App的属性变更通知,同步更新登录状态 ((App)Application.Current).PropertyChanged += (s, e) => { if (e.PropertyName == nameof(App.IsSignedIn)) { OnPropertyChanged(nameof(SignedIn)); } }; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
之后在MainPage.xaml.cs的构造函数中设置数据上下文:
public MainPage() { this.InitializeComponent(); this.DataContext = new MainPageViewModel(); }
最后修改MainPage.xaml的绑定逻辑(同样需要先加方案1中提到的转换器):
<StackPanel Visibility="{Binding SignedIn, Converter={StaticResource BoolToVisConverter}}"> <!-- 内部按钮代码保持不变 --> </StackPanel>
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

