为什么我不能将值从我的全局静态 class 设置为 TextBlock XAML

Why can't I set value from my Global static class to a TextBlock XAML

这里是 XAML :

<StackPanel Grid.Column="2" Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Left">
                <TextBlock  x:Name="lbl1"  Text="1"  Margin="0,0,0,0"  FontSize="15" Foreground="White" HorizontalAlignment="Left" FontFamily="Arial" VerticalAlignment="Bottom" />
                <TextBlock  x:Name="lbl1Text" Text="{x:Static local:Globals.CurrentUser.FullName}" Grid.Column="0" Margin="0"  FontSize="16" Foreground="White" HorizontalAlignment="Left"  FontFamily="Arial"  />
</StackPanel>

因为可以看到我正在尝试设置当前登录的用户,该用户在我的项目中被保存在 STATIC class 中。

在表单加载时,我将该用户设置为 Globals.CurrentUser = LoggedIn();

当我尝试将此用户设置为我的 TextBlock 时,因为我想显示当前登录的 FullName,我遇到了这个问题:

不支持嵌套类型:Globals.CurrentUser.FullName

这意味着我无法从我的对象 CurrentUser 访问 property FullName? 我该如何解决这个问题,为什么会这样?

P.S 我知道如何在后面的代码中做到这一点:

lbl1.Text = Globals.CurrentUser.FullName; //这可能有效

但我认为 "more right" 方法是通过 XAML

将其绑定到 TextBlock

谢谢大家 干杯

那是因为 x:Static 语法是(引用自文档):

<object property="{x:Static prefix:typeName.staticMemberName}" .../>

其中

typeName: The name of the type that defines the desired static member.

staticMemberName: The name of the desired static value member (a constant, a static property, a field, or an enumeration value).

如您所见 - 您只能使用类型名称和一个成员名称。此标记扩展不支持像 Global.CurrentUser.FullName 这样的语法。

作为一种解决方法,您可以像这样使用一次性绑定:

<TextBlock Text="{Binding Source={x:Static local:Globals.CurrentUser}, Path=FullName, Mode=OneTime}" />

如果您的路径中有更多部分,例如 Globals.CurrentUser.Person.FullName - 您仍然可以使用绑定。由于 x:Static 只支持一个 属性 - 其余的将进入 Path:

<TextBlock Text="{Binding Source={x:Static local:Globals.CurrentUser}, Path=Person.FullName, Mode=OneTime}" />

OneTime 绑定不是必需的,但它是一种很好的做法,甚至可以稍微提高性能(当然很少)。绑定通常用于在目标和源之间创建某种关系(如源更改时更新目标等)。在这种情况下,我们不需要所有这些,我们只需要从源(静态 属性)获取一个值并分配给目标(文本块文本)。使用 OneTime 我们告诉 wpf 绑定来做到这一点,甚至不必费心去寻找一种方法来监听源 属性 的变化(无论如何这在这里是不可能的)。