我遇到了一个无法解决的xaml问题。我对xaml和绑定不是很熟练,所以我搜索帮助(我使用MAUI.NET)。我的问题是:
我有这个类MemoryInfo:
namespace APEEvo.Mobile.Settings
{
public static class MemoryInfo
{
public static LoginInfo CurrentUserInfo { get; set; }
}
}
CurrentUserInfo引用此类:
namespace APEEvo.Commons
{
public class LoginInfo
{
public string UserName { get; set; }
public string UserNameFull { get; set; }
public string Role { get; set; }
}
}
我的目的是在一个标签中直接绑定到XAML(而不是通过代码)中的信息MemoryInfo.CurrentUserInfo.UserNameFull.类似这样的东西:
<Label x:Name="txtUsername" Text="{Binding Mode=TwoWay, Source={x:DynamicResource Settings:MemoryInfo}, Path=LoginInfo.UserNameFull }" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0"/>
因此,当MemoryInfo.CurrentUserInfo.UserNameFull更改为另一个页面时,我可以在此标签中看到修改。
感谢支持
我更新了所有的xaml:
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:Settings="clr-namespace:APEEvo.Mobile.Settings"
x:Class="APEEvo.Mobile.Components.InfoBar">
<HorizontalStackLayout BackgroundColor="#85ABD5" >
<Grid Margin="5,5">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="90" />
</Grid.ColumnDefinitions>
<ImageButton Grid.Column="0" WidthRequest="25" HeightRequest="25" Source="icon_infobar_menu.png" Clicked="ImageButton_Clicked" Margin="0,0,10,0"/>
<ImageButton Grid.Column="1" x:Name="imgLogo" Source="logo_ae1.png" Clicked="ImageButton_Clicked" Margin="0,0,350,0"/>
<Grid Grid.Column="2" >
<HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Image Source="icon_infobar_tablet.png" WidthRequest="25" HeightRequest="25" Margin="0,0,5,0"/>
<Label x:Name="txtMachine" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0"/>
<Line Stroke="White" Y1="0" Y2="50" StrokeDashArray="4,4" StrokeDashOffset="2"/>
</HorizontalStackLayout>
</Grid>
<Grid Grid.Column="3" >
<HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Image Source="icon_infobar_login.png" WidthRequest="25" HeightRequest="25" Margin="0,0,5,0"/>
<Label x:Name="txtUsername" Text="{Binding Mode=TwoWay, Source={x:Null Settings:MemoryInfo.CurrentUserInfo}, Path=UserNameFullName }" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0"/>
<Line Stroke="White" Y1="0" Y2="50" StrokeDashArray="4,4" StrokeDashOffset="2"/>
</HorizontalStackLayout>
</Grid>
<Grid Grid.Column="4" >
<HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
<ImageButton Source="icon_infobar_logout.png" BackgroundColor="Transparent" WidthRequest="25" HeightRequest="25" Margin="0,0,5,0" Clicked="ImageButtonLogout_Clicked"/>
<Label Text="Logout" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0"/>
<Line Stroke="White" Y1="0" Y2="50" StrokeDashArray="4,4" StrokeDashOffset="2"/>
</HorizontalStackLayout>
</Grid>
<Grid Grid.Column="5" >
<HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
<ImageButton Source="icon_infobar_info.png" WidthRequest="25" HeightRequest="25" Margin="0,0,5,0" Clicked="ImageButtonHelp_Clicked"/>
<Label Text="Help" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0"/>
<Line Stroke="White" Y1="0" Y2="50" StrokeDashArray="4,4" StrokeDashOffset="2"/>
</HorizontalStackLayout>
</Grid>
<Grid Grid.Column="6" >
<HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Image Source="icon_infobar_clock.png" WidthRequest="25" HeightRequest="25" Margin="0,0,5,0"/>
<Label x:Name = "txtClock" Text="17:22" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,15,0" />
</HorizontalStackLayout>
</Grid>
</Grid>
</HorizontalStackLayout>
1条答案
按热度按时间woobm2wo1#
你实际上问的是“如何绑定一个静态类的静态属性”。
首先,你的属性是不可观察的。setter应该通知你已经做了一个改变。所以当这个静态属性在程序的其他地方被设置时,它知道它必须在它绑定的地方被更新。
第二,请不要做上面的任何事情。10年来,我不得不处理那些通过与静态结构共享数据编写的旧项目。调试问题和修复问题是一场噩梦。
我建议您改变设计方法。
新用户已登录。您可能正返回到已打开的页面,并且希望更新UI。请重写OnAppearing并在此处进行更改。
如果您真的想共享,可以通过依赖注入单例来实现。
此外,有时你可能想让用户保持登录状态。为什么不使用设置来存储信息,这些信息可以从应用程序的任何地方访问,并且在应用程序重新启动后仍然可以重用。
编辑:在某些情况下,我需要在分离的片段之间传递发生了什么事情的信息(为了使它们尽可能分离),我使用CommunityToolkit.MVVM Messaging。
这是避免使用静态类的另一个不错的方法。