2011-09-25 167 views
1

我試圖將我的控制檯應用程序轉換爲一個很好的WPF GUI。我對這段代碼有點不解,想知道是否有人可以幫忙?WPF簡單綁定

在我的XAML中我有這樣的:

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

嘗試和複選框的值綁定到CL.LoggedIn的價值。 CL是被引用的類庫中的ConnectionLibrary.cs類。

在後面的代碼爲XAML頁面我宣佈CL如下:

public ConnectionLibrary CL = new ConnectionLibrary(); 

在連接庫類我已經加入:INotifyPropertyChanged的到類聲明,並添加以下代碼:

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)); 
    } 
} 

我已經改變了的loggedIn屬性到現在這個樣子:

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

但是,它似乎無法在我的xaml中工作?我沒有得到輸出窗口中的任何綁定錯誤,但它並沒有正確反映LoggedIn的值。

任何想法?

謝謝!

+0

你不應該使用公共字段,就像你使用'CL'一樣。 – svick

+0

閱讀[數據綁定概述](http://msdn.microsoft.com/en-us/library/ms752347.aspx)。 –

回答

2

您是否設置了您的視圖的datacontext? 在您的XAML文件的代碼隱藏,你需要做的:

this.DataContext = CL; 

那麼綁定是:

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

結合會發現物體上的指定路徑(即的loggedIn)即在DataContext中。

編輯:默認綁定是單向的,這意味着它只會從您的ViewModel更新。
對於可以輸入數據的控件(即:TextBox,CheckBox ...),可以將Binding設置爲「TwoWay」。綁定表達式變爲:

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

現在,只要在UI中檢查狀態發生變化,它就會反映在您的ViewModel中。

+0

優秀 - 我只是讀代碼找到datacontext設置在哪裏,這裏是:=) –

+0

說我想保留datacontext只是代碼隱藏文件,因爲我想從其他幾個類中彙總數據。我將如何鏈接到CL.LoggedIn然後保持綁定工作,只要屬性更改? – user963541

+0

我不確定我是否理解您在上次評論中提出的問題。你的代碼隱藏應該是乾淨的,只需設置datacontext。該邏輯應該在你的ViewModel中(並且它應該實現INotifyPropertyChanged)。查看我更新的雙向綁定答案。 –

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

試過了,似乎仍然沒有工作。 – user963541

2

當您使用這樣的Binding時,它會綁定到當前的DataContext,而不是頁面本身。

解決這個問題的最簡單方法是在頁面構造函數的末尾設置DataContext = this

修復它的正確方法是使用MVVM。這意味着ConnectionLibrary在另一個類的屬性中,並將DataContext設置爲另一個類。