This can be easily done using WPF validation mechanisms. First, since you want to follow the WPF architecture, I recommend that you use the WPF Command Model .
Now to implement your functionality you can add CommandBinding to Window / UserControl or Button :
<Button Content="Save" Command="Save"> <Button.CommandBindings> <CommandBinding Command="Save" Executed="Save_Executed" CanExecute="Save_CanExecute" /> </Button.CommandBindings> </Button>
You can now subscribe to the CanExecute event to enable or disable your button based on your validation logic. I recommend these readings before continuing:
Validation in Windows Presentation Foundation
Using custom validation rules in WPF
The easiest way to fulfill your requirements:
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>
Code behind
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) {
Hope this helps.
source share