user963541
user963541

Reputation: 13

WPF Simple Binding

I'm trying to convert my console app to a nice WPF GUI. Am getting a little stuck on this code and was wondering if someone can help?

In my xaml I have this:

<CheckBox IsChecked="{Binding CL.LoggedIn}"></CheckBox>

to try and bind the value of the checkbox to the value of CL.LoggedIn. CL is my ConnectionLibrary.cs class in a referenced class library.

In the code behind for the xaml page i declare CL as follows :

public ConnectionLibrary CL = new ConnectionLibrary();

In the connection library class I have added :INotifyPropertyChanged to the class declaration and added the following code:

public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

I have changed the LoggedIn property to now look like this:

private bool loggedIn;
public bool LoggedIn { 
    get { return loggedIn; } 
    set { loggedIn = value; OnPropertyChanged("LoggedIn"); }
}

However, it doesnt seem to work in my xaml? I dont get any binding errors in the output window, but it doesnt reflect the value of LoggedIn correctly.

Any ideas?

Thanks!

Upvotes: 1

Views: 165

Answers (3)

Louis Kottmann
Louis Kottmann

Reputation: 16648

Have you set the datacontext of your view? In the code-behind of your XAML file, you need to do:

this.DataContext = CL;

then the binding is:

<CheckBox IsChecked="{Binding LoggedIn}"></CheckBox>

The binding will find the the named path (i.e. LoggedIn) on the object that is in the DataContext.

EDIT: The default binding is one-way, this means it only gets updated from your ViewModel.
For controls that can be inputed data (i.e: TextBox, CheckBox...) you can set the Binding as "TwoWay". The Binding expression becomes:

<CheckBox IsChecked="{Binding LoggedIn, Mode="TwoWay"}"></CheckBox>

Now whenever the Checked state changes in the UI, it is reflected in your ViewModel.

Upvotes: 2

svick
svick

Reputation: 245008

When you use Binding like this, it binds to the current DataContext, not to the page itself.

The easiest way to fix this would be to set DataContext = this at the end of the constructor of the page.

The proper way to fix it would be to use MVVM. That would mean having ConnectionLibrary in a property of another class and set the DataContext to this other class.

Upvotes: 2

Jason Li
Jason Li

Reputation: 1585

<CheckBox IsChecked="{Binding LoggedIn}"></CheckBox>

Upvotes: 0

Related Questions