XAML 将类属性绑定到标签

8zzbczxx  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(148)

我遇到了一个无法解决的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>
woobm2wo

woobm2wo1#

你实际上问的是“如何绑定一个静态类的静态属性”。
首先,你的属性是不可观察的。setter应该通知你已经做了一个改变。所以当这个静态属性在程序的其他地方被设置时,它知道它必须在它绑定的地方被更新。
第二,请不要做上面的任何事情。10年来,我不得不处理那些通过与静态结构共享数据编写的旧项目。调试问题和修复问题是一场噩梦。
我建议您改变设计方法。
新用户已登录。您可能正返回到已打开的页面,并且希望更新UI。请重写OnAppearing并在此处进行更改。
如果您真的想共享,可以通过依赖注入单例来实现。

builder.Services.AddSingleton<ILogin, LoginService>();

此外,有时你可能想让用户保持登录状态。为什么不使用设置来存储信息,这些信息可以从应用程序的任何地方访问,并且在应用程序重新启动后仍然可以重用。

public string FirstName
        {
            get => settings.Get("FirstName", "");
            set => settings.Set("FirstName", value);
        }

编辑:在某些情况下,我需要在分离的片段之间传递发生了什么事情的信息(为了使它们尽可能分离),我使用CommunityToolkit.MVVM Messaging。
这是避免使用静态类的另一个不错的方法。

相关问题