【问题标题】:XAML Binding to propertyXAML 绑定到属性
【发布时间】:2012-12-05 22:49:02
【问题描述】:

我的 XAML+C# Windows 应用商店应用程序中有复选框。我还有 bool 属性:WindowsStoreTestApp.SessionData.RememberUser,它是公共的和静态的。

我希望复选框的属性 IsChecked 与此 bool 属性一致(或绑定或映射)。

我试过这个: 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; }
    }
}

但它似乎不起作用。你能帮帮我吗?

【问题讨论】:

  • 你能澄清什么不起作用吗?是双向更新不起作用吗?它根本不起作用吗?另外,你能展示一下 SessionData(尤其是 RememberUser)的代码吗?这将有助于我们诊断问题。
  • 当其中一个发生变化时,第二个也应该发生变化。
  • 无论我更改哪个,映射都不起作用。我尝试在代码中更改属性,复选框未选中。尝试相反,选中复选框,然后在调试器中查看,属性没有改变
  • 我喜欢这样的经典问题。查看此绑定演练blog.jerrynixon.com/2012/10/xaml-binding-basics-101.html 并关注 INotifyPropertyChanged。
  • @Jerry: 谢谢,我只是觉得它是内置的简单功能

标签: c# xaml data-binding microsoft-metro windows-runtime


【解决方案1】:
<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");
        }
    }
}

【讨论】:

    【解决方案2】:

    您需要实现某种形式的更改通知,以便您的复选框“了解”属性的任何更改。最好的办法是使用众多 MVVM 框架之一,如果没有,请在您的 ViewModel 中实现 INotifyPropertyChanged。

    另外,通常在 WPF 中,我们不会设置单个控件的 DataContext,而是将 Window 或 User Control 的 DataContext 设置为 ViewModel...

    这是一个通过 MVVM 框架之一具有更改通知的属性示例:

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

    如您所见,一个简单的自动实现的属性不能用于 WPF 中的数据绑定...

    我建议通过 MSDN 上的 Data Binding Overview...

    【讨论】:

    • 感谢您的回答。有没有简单的方法来绑定一个唯一的属性?我不想只为一个属性生成大量代码,那么处理更改事件会更容易。
    • 将 Window 或 User Control 的 DataContext 设置为 ViewModel 类并在该类中定义如上所示的属性一点也不复杂。如果您不想使用 MVVM 框架,最简单的方法是在该类上实现 INotifyPropertyChanged 接口,以便在属性发生任何更改时通知您的控件。毕竟代码真的不多……
    【解决方案3】:

    您不能绑定到静态属性,因为静态属性不能引发 PropertyChanged 事件。当然,您将需要 INotifyPropertyChanged。但这与静态属性无关。您根本无法绑定到静态属性。 (你可以在 WPF 和 Silverlight 中)

    【讨论】:

      【解决方案4】:

      试试这样,注意属性不是静态的,但支持字段是:

      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}"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 2014-08-11
        • 1970-01-01
        • 2013-09-24
        相关资源
        最近更新 更多