2012-12-05 118 views
7

我在我的XAML + C#的Windows Store應用程序複選框。此外,我有布爾屬性:WindowsStoreTestApp.SessionData.RememberUser這是公開和靜態的。XAML綁定到財產

我想複選框的財產IsChecked是一致的(或綁定,或映射)這個布爾屬性。

我嘗試這樣做: XAML

<CheckBox x:Name="chbRemember1" IsChecked="{Binding Mode=TwoWay}"/> 

C#

chbRemember1.DataContext = SessionData.RememberUser; 

代碼屬性:

namespace WindowsStoreTestApp 
{ 
    public class SessionData 
    { 
     public static bool RememberUser { get; set; } 
    } 
} 

但它似乎並沒有工作。你可以幫我嗎?

+0

你能澄清一下沒有關於它的工作?雙向更新不起作用嗎?它不工作嗎?另外,你可以顯示SessionData的代碼(特別是RememberUser)嗎?這將幫助我們診斷問題。 –

+0

每當其中一個變化時,第二個也應該改變。 – imslavko

+0

無論我更改,映射都不起作用。我嘗試在代碼中更改屬性,複選框沒有檢查。嘗試對面,複選框,然後在調試器中查看,財產並沒有改變 – imslavko

回答

3

您需要實現,以便您的複選框是任何更改屬性「知道」某種形式的變更通知。最好的辦法是使用其中一個MVVM框架,如果沒有,在您的ViewModel中實現INotifyPropertyChanged

另外,通常在WPF,我們不設置各個控件的DataContext的,但設置窗口或用戶控制到一個視圖模型的DataContext的...

這是通過與變更通知的屬性的例子在MVVM框架之一:

private bool createTrigger; 
public bool CreateTrigger 
{ 
    get { return createTrigger; } 
    set { createTrigger = value; NotifyPropertyChanged(m => m.CreateTrigger); } 
} 

正如你可以看到一個簡單的自動實現屬性不能用於數據在WPF結合...

我建議通過Data Binding Overview MSDN上了去..

+0

謝謝你的回答。有沒有簡單的方法來綁定一個唯一的屬性?我不想爲一個屬性生成大量的代碼,那麼只需處理更改事件就更容易。 – imslavko

+0

將Window或User Control的DataContext設置爲ViewModel類並且在該類中定義如上所示的屬性並不複雜。如果您不想使用MVVM框架,那麼最簡單的方法是在該類上實現INotifyPropertyChanged接口,以便將控件通知該屬性的任何更改。畢竟它並不是那麼多的代碼...... –

5
<CheckBox x:Name="chbRemember1" IsChecked="{Binding Path=RememberUser, Mode=TwoWay}"/> 

 

public class SessionData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 


    bool _rememberUser; 
    public bool RememberUser 
    { 
     get 
     { 
      return _rememberUser; 
     } 
     set 
     { 
      _rememberUser = value; 
      NotifyPropertyChanged("RememberUser"); 
     } 
    } 
} 
3

試試這個樣子,注意,該酒店是不是靜態的,而是支持字段是:

public class SessionData : INotifyPropertyChanged 
{ 
    private static bool _rememberUser; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public bool RememberUser 
    { 
     get { return _rememberUser; } 
     set 
     { 
      _rememberUser = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
this.DataContext = new SessionData(); 
<CheckBox x:Name="chbRemember1" IsChecked="{Binding RememberUser, Mode=TwoWay}"/> 
3

由於靜態屬性無法引發PropertyChanged事件,因此無法綁定到靜態屬性。您當然需要INotifyPropertyChanged。但是這與靜態屬性無關。你根本無法綁定到靜態屬性。 (您可以在WPF和Silverlight)