输入值后的按钮可见性(XAML、C#、IValueConverter)

Button visibility after enter value (XAML, C#, IValueConverter)

我有 xaml 文件,我在其中放置了 2 个文本框,我可以在其中放置登录名和密码。之后 Button "Login" 应该是可见的。这是我的代码:

TreeView.xaml 文件:

<UserControl x:Class="LayoutMVVM.Views.TreeView"
   xmlns:local="clr-namespace:LayoutMVVM.Views"
   xmlns:Treemodels="clr-namespace:LayoutMVVM.ViewModels"  .../>
   <UserControl.Resources>
        <Treemodels:VBConverter x:Key="VBConverter" />
   </UserControl.Resources>
<Grid>
 ....
    <TextBox  Grid.Row="2" Grid.Column="2" Text="{Binding Login, UpdateSourceTrigger=PropertyChanged}" Background="AliceBlue" />
    <TextBox  Grid.Row="1" Grid.Column="2" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" Background="AliceBlue" />

    <Button Grid.Row="3" Grid.Column="3" Visibility="{Binding IsVerifyTrue, Converter={StaticResource VBConverter}}" Content="Login" />
</Grid>

TreeView.xaml.cs

namespace LayoutMVVM.Views
{
 public partial class TreeView : UserControl
 {
  public TreeView()
  {
   InitializeComponent();
  }
  public TreeView _isVerifyTrue;
    public TreeView IsVerifyTrue
    {
        get { return this; }
        set
        {
            _isVerifyTrue = value;
            OnPropertyChanged(() => IsVerifyTrue);
        }
    }

    private void OnPropertyChanged(Func<object> p)
    {
        throw new NotImplementedException();
    }

    private string _login;
    public string Login
    {
        get { return _login; }
        set
        {
            _login = value;
            IsVerifyTrue = this;
            OnPropertyChanged(() => Login);
        }
    }

    private string _password;
    public string Password
    {
        get { return _password; }
        set
        {
            _password = value;
            IsVerifyTrue = this;
            OnPropertyChanged(() => Password);
        }
    } 
}

并为 VBConverter.cs 分隔 class:

namespace LayoutMVVM.ViewModels
{
    public class VBConverter : IValueConverter 
    { 
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       { 
             if (value is TreeView) 
             { 
                 var tv = value as TreeView; 
                 bool result = !string.IsNullOrEmpty(tv.Login)  
                     && !string.IsNullOrEmpty(tv.Password); 
                 return result? Visibility.Visible : Visibility.Hidden; 
             } 
             return Visibility.Hidden; 
         }  

         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         { 
             throw new NotImplementedException(); 
         } 
     }
}

当我启动应用程序时,按钮始终可见,但我不知道出了什么问题。

为此您需要 MultiValueConverter。请参阅以下示例:

XAML :

<Window x:Class="SOSample1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SOSample1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <local:VisibilityConverter x:Key="VisibilityConverter" />
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <TextBox  Grid.Row="0" Name="user" Height="100" Width="200"  Text="{Binding Login, UpdateSourceTrigger=PropertyChanged}" Background="AliceBlue" />
    <TextBox  Grid.Row="1" Name="password" Height="100" Width="200" Text="{Binding Login, UpdateSourceTrigger=PropertyChanged}" Background="AliceBlue" />
    <Button Grid.Row="2" Content="Login" Height="100" Width="200" >
        <Button.Visibility>
            <MultiBinding Converter="{StaticResource VisibilityConverter}" >
                <Binding ElementName="user" Path="Text" />
                <Binding  ElementName="password" Path="Text" />
            </MultiBinding>
        </Button.Visibility>
    </Button>
</Grid>

转换器:

public class VisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {               
        bool result = false;
        if (values != null)
        {
            foreach (var item in values)
            {
                result = (item as string).Length > 0;
                if (!result) break;
            }                
        }
        return (Visibility)new BooleanToVisibilityConverter().Convert(result, targetType, parameter, culture);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {            
        return null;
    }
}  

输出