This can be easily done using the WPF validation mechanisms. First since you want to follow the WPF architecture I would reccomend you to use the WPF Command model.
Now to implement your functionality, you can add a CommandBinding to the Window/UserControl or to the Button itself:
<Button Content="Save" Command="Save"> <Button.CommandBindings> <CommandBinding Command="Save" Executed="Save_Executed" CanExecute="Save_CanExecute" /> </Button.CommandBindings> </Button>
Now you can subscribe to the CanExecute event to enable or disable your button based on your validation logic. I recommend these reads before you continue:
Validation in Windows Presentation Foundation
Using Custom Validation Rules in WPF
The simplest way to do your requirement is as given below:
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) { //Your code } private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = !(string.IsNullOrEmpty(Username) && string.IsNullOrEmpty(Password)); } }
Hope this helps.
INotifyPropertyChangedand has a command that implementsICommand. However the frameworks just make writing these easier and I would suspect this would still be easier than another solution you might come across