2012-12-05 94 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)