Почему может не работать привязка флажка wpf? - PullRequest
1 голос
/ 05 декабря 2011

Несколько ответов на вопросы о привязке флажков, например этот предполагает

<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, я использую его, но хотел, чтобы этот код был максимально простым

Ответы [ 3 ]

3 голосов
/ 05 декабря 2011

Вам необходимо установить свой DataContext для объекта, который содержит свойства, с которыми связан xaml.В вашем случае просто поместите Datacontext = this; в c'tor.А также реализовать интерфейс INotifyPropertyChanged и RaisePropertyChange из каждого связанного свойства.

Как уже говорили другие, лучше использовать шаблон MVVM, в котором свойства хранятся в отдельном классе, а не в коде пользовательского интерфейса.

2 голосов
/ 05 декабря 2011

Реализуйте 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");
            }
        }
    }
}
2 голосов
/ 05 декабря 2011

Вы должны реализовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...