【问题标题】:Why might wpf check box binding fail to work?为什么 wpf 复选框绑定可能无法正常工作?
【发布时间】:2011-12-05 09:42:20
【问题描述】:

关于复选框绑定问题的几个答案,例如this one 建议

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/> 

应该可以。我在下面的代码中遗漏了什么,这不起作用?

<Window x:Class="TestBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <CheckBox Name="checkBox1" IsChecked="{Binding Path=MyProperty, Mode=TwoWay}">CheckBox</CheckBox>
    </Grid>
</Window>

namespace TestBinding
{
    public partial class Window1 : Window
    {
        bool property = true;

        public Window1()
        {
            InitializeComponent();
        }

        public bool MyProperty
        {
            get
            {
                return property;
            }
            set
            {
                property = value;
            }
        }
    }
}

更新

3 个很好的答案,非常感谢,我想全部接受,但接受了第一个提到 DataContext 的部分,这是影响我最感兴趣的绑定方向的部分。TwoWay 模式原来是红鲱鱼 感谢 MVVM 的建议,我正在使用它,但希望此代码尽可能简单

【问题讨论】:

  • 你应该支持 INotifyPropertyChanged 接口以保持绑定工作
  • Binding 关键字仅适用于 DataContext 属性。我会将 MyProperty 属性移动到视图模型并将其绑定到视图。

标签: c# wpf binding


【解决方案1】:

您需要将 DataContext 设置为包含 xaml 绑定到的属性的对象。在您的情况下,只需将 Datacontext = this; 放在 c'tor 中。以及从每个绑定属性实现 INotifyPropertyChanged 接口和 RaisePropertyChange。

正如其他人已经说过的,最好使用 MVVM 模式,其中您将属性存储在单独的类中,而不是隐藏在 UI 代码中。

【讨论】:

    【解决方案2】:

    实现 INotifyPropertyChanged,并将 DataContext 设置为“this”:

    namespace TestBinding
    {
        public partial class Window1 : Window, INotifyPropertyChanged
        {
            #region INotifyPropertyChanged
            public event PropertyChangedEventHandler PropertyChanged;
            private void RaisePropertyChanged(String _Prop)
            {
                if (PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(_Prop));
                }
            }
            #endregion
    
            bool property = true;
    
            public Window1()
            {
                InitializeComponent();
                this.DataContext = this;
            }
    
            public bool MyProperty
            {
                get
                {
                    return property;
                }
                set
                {
                    property = value;
                    RaisePropertyChanged("MyProperty");
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您应该实现 INotifyPropertyChanged 并将 DataContext 绑定到此,然后它应该可以工作。

      你可以在这里找到msdn链接:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

      但是,您应该查看模式 MVVM 来处理您的 wpf/silverlight 窗口。它会让你的生活更轻松:http://en.wikipedia.org/wiki/Model_View_ViewModel

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多