Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Mode=TwoWay binding


Автор: sameness 26.5.2011, 19:08
Доброго времени..
Подскажите пожалуйста, почему не работает binding с параметром Mode=TwoWay:
Есть UserControl наследованый от Grid'а:
Код

    public partial class ContainerControl : Grid
    {
        public static readonly DependencyProperty TestProperty =
            DependencyProperty.Register("Test", typeof(bool), typeof(ContainerControl));

        [DefaultValue(false)]
        public bool Test
        {
            get { return (bool)this.GetValue(TestProperty); }
            set 
            {
                if ((bool)this.GetValue(TestProperty) != value)
                {
                    this.SetValue(TestProperty, value);
                    OnPropertyChanged("Test", value);
                }
            }
        }
      .
      .
   }


есть MainWindow с кодом:
Код

.
.
<ribbon:RibbonCheckBox x:Name="TestCheckBox" Label="TestCheckBox" IsChecked="{Binding Test, ElementName=Container, Mode=TwoWay}" />
.
.
<app:ContainerControl x:Name="Container" Grid.Row="1"/>
.
.

binding не работает ни в одну сторону, меняю из кода значение свойства Test, CheckBox не устанавливается, устанавливаю CheckBox с GUI, значение свойства не меняется.. меняя значение OwnerType при регистрации DependencyProperty добивался что работы связки в одну сторону, но ни разу не получилось в обе стороны...

Автор: -Mikle- 27.5.2011, 12:47
Вероятнее всего, Binding не может найти ElementName=Container, либо глючит риббон. Для проверки, попробуй объявить простой CheckBox с таким же биндингом сразу после ContainerControl.

PS: вот такое объявление свойства вполне рабочее для двусторонней привязки:
Код

       public static readonly DependencyProperty TestProperty =
            DependencyProperty.Register("Test", typeof(bool), typeof(ContainerControl));

        public bool Test
        {
            get { return (bool)this.GetValue(TestProperty); }
            set { this.SetValue(TestProperty, value); }
        }

Автор: jonie 27.5.2011, 14:42
можно посмотреть в окно output - там в случае ошибок binding-а пишется трассировочная информация

Автор: sameness 27.5.2011, 22:19
Прошу прощения, все работает)
проверял брейкпоинтами, в случае DependencyProperty выполнение не останавливалось в точке
Код

            set 
            {
                if ((bool)this.GetValue(TestProperty) != value)
                {
                    this.SetValue(TestProperty, value);
                    OnPropertyChanged("Test", value);
                }
            }

где я и ставил брейкпоинт. Когда вывел значение свойства на экран, оказалось что оно устанавливается в обоих случаях, но в одном из, минуя выполнение метода OnPropertyChanged("Test", value);
с уведомлениями об изменении свойства разобрался по http://msdn.microsoft.com/ru-ru/magazine/cc794276.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)