我试图在单击按钮时使用 MVVM 隐藏一些框架和标签。 IsVisible() 只是不起作用。 其他绑定元素工作正常。
视图模型
namespace LoginApp.ViewModels
{
public partial class LoginViewModel : ObservableObject
{
[ObservableProperty]
string testString;
[ObservableProperty]
bool passwordView;
[ObservableProperty]
bool loginView;
public LoginViewModel()
{
this.LoginView = true;
this.PasswordView = false;
this.TestString = "Before";
}
[RelayCommand]
void Login()
{
LoginView = false;
PasswordView = true;
TestString = PasswordView.ToString();
}
}
}
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="LoginApp.LoginPage"
Title="LoginPage"
BackgroundColor="{StaticResource DarkerBackground}"
xmlns:viewmodel="clr-namespace:LoginApp.ViewModels">
<Grid RowDefinitions="5*,*" ColumnDefinitions="*,*">
[...]
<Grid RowDefinitions="50,Auto,Auto,Auto,Auto" RowSpacing="10" Padding="25">
[...]
<StackLayout Grid.Row="1" Spacing="10">
[...]
<Label Text="hej" HorizontalOptions="Center" TextColor="{StaticResource LighterBackground}" FontSize="20" FontAttributes="Bold" IsVisible="{Binding PasswordView}"/>
</StackLayout>
<StackLayout Grid.Row="2">
<Frame Padding="0" CornerRadius="10" BorderColor="White" HeightRequest="40">
<Entry BackgroundColor="White" Placeholder="Username" ClearButtonVisibility="WhileEditing" HeightRequest="40" Text="{Binding TestString }"/>
</Frame>
<Frame Padding="0" CornerRadius="10" BorderColor="White" HeightRequest="40" IsVisible="{Binding PasswordView}" >
<Entry BackgroundColor="White" Placeholder="Password" ClearButtonVisibility="WhileEditing" HeightRequest="40" IsPassword="True"/>
</Frame>
</StackLayout>
<Button Grid.Row="3" WidthRequest="100" HeightRequest="40" Text="Login" BackgroundColor="{StaticResource Background}" VerticalOptions="EndAndExpand" Command="{Binding LoginCommand}" />
<Label Grid.Row="4" Text="Log in as another user" TextColor="{StaticResource LighterBackground}" TextDecorations="Underline" HorizontalOptions="Center" IsVisible="{Binding PasswordView}" VerticalOptions="EndAndExpand" />
</Grid>
</Frame>
</Frame>
[...]
</Grid>
</ContentPage>
当 debuggig 属性被更改时,但它就像 PropertyChangedEventArgs 永远不会被调用或其他东西
分别绑定到
IsVisible
的 ObservableProperty
属性运行良好。
如果想在点击按钮后隐藏边框和标签,只需要将属性
LoginView
和PasswordView
设置为false即可。我根据你的代码片段做了一些逻辑上的调整,你可以参考一下:
<Grid RowDefinitions="5*,*" ColumnDefinitions="*,*">
<Grid RowDefinitions="50,Auto,Auto,Auto,Auto" RowSpacing="10" Padding="25">
<StackLayout Grid.Row="1" Spacing="10">
<Label Text="hej" HorizontalOptions="Center" FontSize="20" FontAttributes="Bold" IsVisible="{Binding PasswordView}"/>
</StackLayout>
<StackLayout Grid.Row="2">
<Frame Padding="0" CornerRadius="10" BorderColor="Black" HeightRequest="40" IsVisible="{Binding PasswordView}" >
<Entry BackgroundColor="White" Placeholder="Username" ClearButtonVisibility="WhileEditing" HeightRequest="40" Text="{Binding TestString }"/>
</Frame>
<Frame Padding="0" CornerRadius="10" BorderColor="Black" HeightRequest="40" IsVisible="{Binding PasswordView}" >
<Entry BackgroundColor="White" Placeholder="Password" ClearButtonVisibility="WhileEditing" HeightRequest="40" IsPassword="True"/>
</Frame>
</StackLayout>
<Button Grid.Row="3" WidthRequest="100" HeightRequest="40" Text="Login" VerticalOptions="EndAndExpand" Command="{Binding LoginCommand}" />
<Label Grid.Row="4" Text="Log in as another user" TextDecorations="Underline" HorizontalOptions="Center" IsVisible="{Binding LoginView}" VerticalOptions="EndAndExpand" />
</Grid>
</Grid>
public partial class MainViewModel : ObservableObject
{
[ObservableProperty]
string testString;
[ObservableProperty]
bool passwordView;
[ObservableProperty]
bool loginView;
public MainViewModel()
{
LoginView = true;
PasswordView = true;
TestString = "Before";
}
[RelayCommand]
void Login()
{
LoginView = false;
PasswordView = false;
TestString = "After";
}
}