为什么我不能将值从我的全局静态 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 绑定来做到这一点,甚至不必费心去寻找一种方法来监听源 属性 的变化(无论如何这在这里是不可能的)。
这里是 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 绑定来做到这一点,甚至不必费心去寻找一种方法来监听源 属性 的变化(无论如何这在这里是不可能的)。