BindingExpression path error: 'SystemParameters'

BindingExpression path error: 'SystemParameters'

更新我的软件时,我开始遇到这个 BindingExpression 错误。

System.Windows.Data Error: 40 : BindingExpression path error: 'SystemParameters' property not found on 'object' ''MainViewModel' (HashCode=4781813)'. BindingExpression:Path=SystemParameters.PrimaryScreenHeight; DataItem='MainViewModel' (HashCode=4781813); target element is 'MainWindow' (Name='XXX'); target property is 'Height' (type 'Double')

System.Windows.Data Error: 40 : BindingExpression path error: 'SystemParameters' property not found on 'object' ''MainViewModel' (HashCode=4781813)'. BindingExpression:Path=SystemParameters.PrimaryScreenWidth; DataItem='MainViewModel' (HashCode=4781813); target element is 'MainWindow' (Name='XXX'); target property is 'Width' (type 'Double')*

看了上面的错误,好像是在MainViewModel中找不到SystemParameters对象。

<Window x:Name="XXXX" x:Class="XXXX.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:XXXX"
    xmlns:localize="http://gu.se/Localization"
    xmlns:properties="clr-namespace:XXXX.Properties"
    mc:Ignorable="d"
    d:DesignHeight="1080" d:DesignWidth="1920"
    Title=""
    WindowStyle="None"
    ResizeMode="NoResize"
    WindowStartupLocation="CenterScreen" WindowState="{Binding WindowState, Mode=TwoWay}"
    DataContext="{Binding Main, Source ={StaticResource Locator}}"
    Height="{Binding SystemParameters.PrimaryScreenHeight}" 
    Width="{Binding SystemParameters.PrimaryScreenWidth}" Background="#FFCCCCCC">

   <Window.Resources>

当我启动我的应用程序时,会调用 Initializer.cs class 来初始化所有参数并创建 MainWindow 的实例。通过调试,我发现这个问题似乎是在我调用window.Show()方法时出现的,然后我的应用程序立即崩溃了。

MainWindow window = new MainWindow();
window.Show();

A Binding 将默认使用元素的 DataContext 解析 属性 路径(这是继承的)。 PrimaryScreenHeight and PrimaryScreenWidth properties are static and part of the type SystemParametersstatic 类型,它不是数据上下文的一部分。要解决此问题,您可以:

  • 使用 x:Static 标记扩展来引用静态属性。

    Implements a markup extension that returns static field and property references.

    Height="{x:Static SystemParameters.PrimaryScreenHeight}"
    Width="{x:Static SystemParameters.PrimaryScreenWidth}"
    
  • 如果需要应用值转换器,可以使用 Source.

    x:Static 标记扩展
    Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, Converter={StaticResource MyConverter}}"
    Width="{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}, Converter={StaticResource MyConverter}}"