You can easily accomplish this using Commanding. If you bind a command on your ViewModel to your button, and the CanExecute method looks for valid info from your other inputs, then it will stay disabled until that condition is met.
In MVVM Light it would look something like this
public RelayCommand LogonCommand { get; private set; }
LogonCommand = new RelayCommand(
Logon,
CanLogon
);
private Boolean CanLogon(){
return !String.IsNullOrWhiteSpance(SomeProperty);
}
In your XAML just be sure to bind the button command to the ViewModel command:
<Button Command="{Binding LogonCommand}" />
If your textbox is bound to SomeProperty
this will work without any extra work, and no code behind necessary.
Also, if you want to have this trigger on property change instead of LostFocus, then you need to define that explicitly.
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource myDataSource}" Path="SomeProperty"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>