UWP 应用程序错误:“无效的绑定路径‘Application.Current’:在类型‘MainPage’上找不到属性‘Application’”

Posted

技术标签:

【中文标题】UWP 应用程序错误:“无效的绑定路径‘Application.Current’:在类型‘MainPage’上找不到属性‘Application’”【英文标题】:UWP Application Error: "Invalid binding path 'Application.Current' : Property 'Application' not found on type 'MainPage' " 【发布时间】:2021-12-07 13:41:33 【问题描述】:

我的 Mainpage.xaml 文件中有以下 XAML

            <StackPanel Visibility="Binding Path=IsSignedIn, Source=x:Bind Application.Current">
                <Button Margin="10" Click="OnSignOut">
                <StackPanel Orientation="Horizontal">
                    <SymbolIcon Symbol="Account"/>
                    <TextBlock Text="Sign Out" Margin="5 0 0 0"/>
                </StackPanel>
                </Button>
            </StackPanel>

如果应用程序的“状态”(在 IsSignedIn 变量中跟踪)已登录,我基本上只想显示退出按钮。

这是调用登录逻辑值“IsSignedIn”的代码

**MainPage.xaml.cs **

    private async void OnSignIn(object sender, RoutedEventArgs e)
    
        try
        
            await(Application.Current as App).SignIn();
        
        catch (Exception ex)
        
            var messageDialog = new MessageDialog("Authentication Error", ex.Message);
            await messageDialog.ShowAsync();

        
    

App.xaml.cs

   public async Task SignIn()
    
        // First, attempt silent sign in
        // If the user's information is already in the app's cache,
        // they won't have to sign in again.
        try
        
            var accounts = await PCA.GetAccountsAsync();

            var silentAuthResult = await PCA
                .AcquireTokenSilent(Scopes, accounts.FirstOrDefault())
                .ExecuteAsync();

            Console.WriteLine("User already signed in.");

        
        catch (MsalUiRequiredException msalEx)
        
            // This exception is thrown when an interactive sign-in is required.
            Console.WriteLine("Silent token request failed, user needs to sign-in: " + msalEx.Message);
            // Prompt the user to sign-in
            var interactiveRequest = PCA.AcquireTokenInteractive(Scopes);

            var interactiveAuthResult = await interactiveRequest.ExecuteAsync();
            Console.WriteLine($"Successful interactive authentication for: interactiveAuthResult.Account.Username");


        
        catch (Exception ex)
        
            Console.WriteLine("Authentication failed. See exception messsage for more details: " + ex.Message);
        
        await GetUserInfo();
        IsSignedIn = true;
        await InitializeGraphClientAsync();
    

错误信息

绑定路径“Application.Current”无效:在类型“MainPage”上找不到属性“Application”。 MSGraphAPIDemo

对不起,如果这是一个菜鸟问题 - 这是我第一次尝试 XAML / UWP。谢谢。

编辑 1

我创建了一个名为 MainPageViewModel.cs 的新类,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MSGraphAPIDemo.DataProvider;
using Windows.UI.Xaml;

namespace MSGraphSPAPIDemo.Model

    public class MainPageViewModel
    
        public bool SignedIn = Application.Current.IsSignedIn;
    

但我得到的错误是:

CS1061“Application”不包含“IsSignedIn”的定义,并且找不到接受“Application”类型的第一个参数的可访问扩展方法“IsSignedIn”(您是否缺少 using 指令或程序集引用?)

在 App.xaml.cs 中,我有以下代码:

    // Is a user signed in?
    private bool isSignedIn;
    public bool IsSignedIn
    
        get  return isSignedIn; 
        set
        
            isSignedIn = value;
            OnPropertyChanged("IsSignedIn");
            OnPropertyChanged("IsSignedOut");
        
    

编辑 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MSGraphAPIDemo.DataProvider;
using Windows.UI.Xaml;

namespace MSGraphAPIDemo.Model

    public class MainPageViewModel
    
        public bool SignedIn  get; set; 

        public MainPageViewModel()
        
            SignedIn = ((App)Application.Current).IsSignedIn;
        
    

【问题讨论】:

【参考方案1】:

这里的问题是运行时正在寻找 Application.Current 作为 MainPage 的属性或子项,但事实并非如此 - 它是一个静态对象。

我建议您绑定一个 ViewModel(在 MainWindow 中设置为您的数据上下文),然后在其中有一个读取 Application.SignedIn 的属性。像这样:

public class MainPageViewModel

    public bool SignedIn => Application.Current.IsSignedIn;

我还建议检查 Microsoft.Extensions.Logging 而不是使用 Console.WriteLine。

【讨论】:

抱歉,我不清楚如何将这个新类/模型与 Application 对象“链接”?对不起.. 请参阅编辑 1【参考方案2】:

我同意@Tylor Pater 的观点,如果您使用 ViewModel 会更好。

我制作了一个简单的测试演示,您可以查看以下适用于我的代码: Xaml:

 <StackPanel Visibility="Binding SignedIn">
        <Button Margin="10" Click="Button_Click">
            <StackPanel Orientation="Horizontal">
                <SymbolIcon Symbol="Account"/>
                <TextBlock Text="Sign Out" Margin="5 0 0 0"/>
            </StackPanel>
        </Button>
    </StackPanel>

主页:

 public sealed partial class MainPage : Page

    public MainPageViewModel ViewModel  get; set; 
    public MainPage()
    
        this.InitializeComponent();

        ViewModel = new MainPageViewModel();

        this.DataContext = ViewModel;
    

    private void Button_Click(object sender, RoutedEventArgs e)
    

    



public class MainPageViewModel

    public bool SignedIn  get; set; 

    public MainPageViewModel()
    
        SignedIn = ((App)Application.Current).IsSignedIn;
    

【讨论】:

感谢您的详细信息!我收到名称 Application 在当前上下文中不存在的错误 - 在新的 ViewModel 类中。请参阅我在整个 ViewModel 类中粘贴的编辑 2。 \ @dot 您的 UWP 应用是本机 UWP 应用吗?还是 Xamarin App 等其他应用? 李,在这种情况下,它是一个 WPF UWP 应用程序。 @dot 什么是 WPF UWP 应用程序。您能否分享更多关于这个特殊项目的细节? @dot 关于这个有什么更新吗?

以上是关于UWP 应用程序错误:“无效的绑定路径‘Application.Current’:在类型‘MainPage’上找不到属性‘Application’”的主要内容,如果未能解决你的问题,请参考以下文章

UWP 尝试保留应用名称时发生意外错误

为啥我在 Windows 10 UWP 上收到“无法注册包”部署错误?

部署 uwp 应用程序时出错(DEP0001:意外错误:-2147009290)

为啥 midiOutOpen 在 UWP 应用程序中返回 1(=未指定错误)?

将 UWP 应用程序提交到 Windows 应用商店时出现错误 1300

Windows 10 UWP 应用程序在启动时崩溃(错误模块名称:Windows.UI.Xaml.dll)