XAML 如何使用.NET MAUI通过Mvvm模式通过x:Name获取组件?

2guxujil  于 2022-12-16  发布在  .NET
关注(0)|答案(2)|浏览(294)

我是新使用.NET MAUI的,我的问题非常简单,但我找不到解决这个问题的方法,我试图使用Mvvm模式通过其x:名称获得任何组件。
这是可能的,通过视图模型?例如,我有一个登录页面后,单击按钮,我希望这个按钮得到阻止,以防止双击。

登录名.xaml

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Ventas_Citel.Views.Login.Login"
         xmlns:viewmodel="clr-namespace:Sales.ViewModels.Login"
         Title="">
<VerticalStackLayout 
   //... login page xaml form ...
   
    <Button Text="Log In" WidthRequest="200" CornerRadius="5" HorizontalOptions="Center" Command="{Binding LoginCommand}" x:Name="loginButton"/>

   //... login page xaml form ...
</VerticalStackLayout>

登录名.xaml.cs

using CommunityToolkit.Mvvm.ComponentModel;
 using CommunityToolkit.Mvvm.Input;
 using CommunityToolkit.Maui.Alerts;
public partial class Login : ContentPage
{
    public Login(LoginViewModel viewModel)
    {
        InitializeComponent();
        BindingContext = viewModel;
    }
}

登录视图模型

public partial class LoginViewModel : ObservableObject
    {
        [RelayCommand]
        async void Login()
        {
            if (!string.IsNullOrWhiteSpace(Email) && !string.IsNullOrWhiteSpace(Password))
            {

                // is there a way to call loginButton component?????
               // i need to disable it with loginButton.IsEnable = false;
                 loginButton.IsEnable = false // doesnt work loginButton doesnt exist

               // if there is any error i need to enable it again so the user can re enter
               // his/her credentials if it fails
                  loginButton.IsEnable = true;
            }

        }

}

我该怎么解决这个问题?

pxy2qtax

pxy2qtax1#

要以正确的MVVM方式解决这个问题,必须向视图模型添加一个附加属性(例如IsLoginButtonEnabled),并将按钮的IsEnabled属性绑定到该属性

视图模型

public partial class LoginViewModel : ObservableObject
{
  private bool _isLoginButtonEnabled;
  public bool IsLoginButtonEnabled
  {
    get => _isLoginButtonEnabled;
    set
    {
       _isLoginButtonEnabled = value;
       PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( "IsLoginButtonEnabled" ) );
    }
  }

  [RelayCommand]
  async void Login()
  {
    if (!string.IsNullOrWhiteSpace(Email) && !string.IsNullOrWhiteSpace(Password))
    {
      this.IsLoginButtonEnabled = false;

      // if there is any error i need to enable it again so the user can re enter
      // his/her credentials if it fails
      
      // In order to enable the button again, just call ...
      //this.IsLoginButtonEnabled = true;
    }
  }
}

查看

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
     x:Class="Ventas_Citel.Views.Login.Login"
     xmlns:viewmodel="clr-namespace:Sales.ViewModels.Login"
     Title="">
<VerticalStackLayout 
   //... login page xaml form ...

  <Button Text="Log In" Command="{Binding LoginCommand}" IsEnabled="{Binding IsLoginButtonEnabled}" />

  //... login page xaml form ...
</VerticalStackLayout>
disho6za

disho6za2#

我想谈谈你的代码:
1.不要尝试访问ViewModel中的View元素。请改用绑定。
1.如果你想绑定使能,不要为特定的按钮命名属性。你不想为每个VisualElement单独处理它。(查看值转换器以获得反转布尔值)
1.这个“isNullOrEmpty”可以很容易地被TextValidationBehavior替换。并且将所有这些绑定到一个bool。所以你不必链接太多的AND检查。

相关问题