这可以通过使用WPF验证机制轻松完成。首先,由于您想遵循WPF体系结构,建议您使用WPF
命令模型。
现在,要实现您的功能,可以将
CommandBinding
添加到Window / UserControl或
Button
本身中:
<Button Content="Save" Command="Save">
<Button.CommandBindings>
<CommandBinding Command="Save"
Executed="Save_Executed" CanExecute="Save_CanExecute" />
</Button.CommandBindings>
</Button>
现在,您可以订阅
CanExecute
事件,根据您的验证逻辑启用或禁用按钮。在继续之前,我建议您阅读以下内容:
Windows Presentation Foundation中的验证和
在WPF中使用自定义验证规则。
实现您的要求最简单的方法如下:
XAML
<Window x:Class="GridScroll.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GridScroll"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<TextBlock Text="User Name" Grid.Column="0" Grid.Row="0"/>
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="Password" Grid.Column="0" Grid.Row="1"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="Save" Grid.Row="2" Grid.ColumnSpan="2" Width="100" HorizontalAlignment="Right" Command="Save">
<Button.CommandBindings>
<CommandBinding Command="Save"
Executed="Save_Executed" CanExecute="Save_CanExecute"/>
</Button.CommandBindings>
</Button>
</Grid>
代码后台
public partial class Window1 : Window,INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
DataContext = this;
}
private string userName;
public string Username
{
get
{
return userName;
}
set
{
userName = value;
OnPropertyChanged("UserName");
}
}
private string password;
public string Password
{
get
{
return password;
}
set
{
password = value;
OnPropertyChanged("Password");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
{
}
private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = !(string.IsNullOrEmpty(Username) && string.IsNullOrEmpty(Password));
}
}
希望这能帮到你。
INotifyPropertyChanged
接口的类和一个实现了ICommand
接口的命令即可。然而,框架可以使编写这些内容变得更加容易,我相信这仍然比你可能遇到的其他解决方案更容易。 - aqwert