Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / UserControl и Binding к свойству / 13 сообщений из 13, страница 1 из 1
02.03.2012, 07:43
    #37687518
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Здравствуйте

Писал небольшой UserControl типа NumericBox'a (типа часы, дла задания времени)
У него имеются свойства Hour и Minute

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
	public partial class Clock : UserControl
	{
        public static DependencyProperty HourProperty = DependencyProperty.Register("Hour", typeof(int), typeof(Clock), new PropertyMetadata((int)0, OnTimeChanged));
        public static DependencyProperty MinuteProperty = DependencyProperty.Register("Minute", typeof(int), typeof(Clock), new PropertyMetadata((int)0, OnTimeChanged));
        public static readonly RoutedEvent TimeChangedEvent=EventManager.RegisterRoutedEvent("TimeChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<int>), typeof(Clock));

        public Clock()
        {
            this.InitializeComponent();
        }

        public int Hour
        {
            get { return (int) GetValue(HourProperty);}
            set { SetValue(HourProperty, value); }
        }
        public int Minute
        {
            get { return (int)GetValue(MinuteProperty); }
            set { SetValue(MinuteProperty, value); }
        }

        private static void OnTimeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            Clock clock = (Clock)sender;
            int newTime;
            int oldTime = (int)e.OldValue;
            if (e.Property==HourProperty)
            {
                //...
                clock.Hour =(int)e.NewValue;
                //...
                newTime = clock.Hour;
                RoutedPropertyChangedEventArgs<int> args = new RoutedPropertyChangedEventArgs<int>(oldTime, newTime);
                args.RoutedEvent = Clock.TimeChangedEvent;
                clock.RaiseEvent(args);
            }
            if (e.Property == MinuteProperty)
            {
              //аналогично
            }
        }
        public event RoutedPropertyChangedEventHandler<int> TimeChanged
        {
            add { AddHandler(TimeChangedEvent, value);}
            remove { RemoveHandler(TimeChangedEvent, value);}
        }

        private void ButtonHUp_Click(object sender, System.Windows.RoutedEventArgs e)
        {
           Hour++;
        }
        //...



Потом пытаюсь забиндиться на эти свойства
Код: xml
1.
<My:Clock Minute="{Binding Path=StartTime.Minute}" Hour="{Binding Path=StartTime.Hour}"/>



где StartTime переменная типа TimeStruct в датаконтексте формы.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  public class TimeStruct : INotifyImplementation
    {
        private int hour;
        public int Hour
        {
            get { return this.hour; }
            set
            {
                if (this.hour != value)
                {
                    this.hour = value;
                    OnPropertyChanged("Hour");
                }
            }
        }
        private int minute;
        public int Minute
        {
            get { return this.minute; }
            set
            {
                if (this.minute != value)
                {
                    this.minute = value;
                    OnPropertyChanged("Minute");
                }
            }
        }



Так вот, биндинг не работает(сами значения свойств обновляются так, как надо). В чем проблема? Подскажите пожалуйста.
...
Рейтинг: 0 / 0
02.03.2012, 11:09
    #37687826
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragon,

ты переборщил с каким то INotifyImplementaion, это че?

Нужно INotifyPropertyChanged
...
Рейтинг: 0 / 0
02.03.2012, 11:17
    #37687849
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
AlexeiK,
Это всего лишь реализация того самого интерфейса. обычно встречается под именем BaseViewModel :)
...
Рейтинг: 0 / 0
02.03.2012, 18:02
    #37689038
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragon,

Я вот одного не понял.
Вот ты объявил класс TimeStruct . Я так понял ты пытаешься с помощью созаднных тобой свойств зависимости подконнектиться к свойствам класса TimeStruct.
А ты создал ресурс на него? Чтобы программа поняла куда ссылаться. я понимаю что это элементарщина, но мало ли...

Реализованный тобою интерфейс класса TimeStruct никак не влияет на то, чтобы была возможность Binding к ним
...
Рейтинг: 0 / 0
02.03.2012, 18:07
    #37689044
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragon,

Ты это эелементарно можешь проверить привязав свойства класса TimeStruct к textblock.
Возможно я тебя не догоняю и ты хочешь сказать, что претензий к классу TimeStruct ты не имеешь, а вся проблема в пользовательских свойствах зависимости, так?
...
Рейтинг: 0 / 0
03.03.2012, 13:47
    #37689599
UserControl и Binding к свойству
В контроле все нормально сделано, и во вью-модели тоже. Видимо вью модель не попадает в DataContext.

автор
Проверяйте DataContext на наличие нужной вью-модели. Например, так - <TextBlock Text="{Binding }" />
...
Рейтинг: 0 / 0
05.03.2012, 07:47
    #37691091
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
unknownfromrus,
с самим TimeStruct и его свойствами все в порядке. К стандартным элементам все биндится замечательно )

Руки-крюки_ ,
и с датаконтекстом все в порядке)

Мда... как обычно сутки тратишь на поиск решения проблемы, а все лежит на поверхности) Не хватило "Mode = TwoWay" ) Видимо по умолчанию у юзерконтролов стоит OneWay.

Всем спасибо )
...
Рейтинг: 0 / 0
05.03.2012, 10:14
    #37691176
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragon,

Ну то что Mode по умолчанию OneWay - это ни для кого не секрет.
НО.... даже если оставить OneWay - то от твоего класса (а в итоге от твоего DataContext) все равно должны привязаться данные к твоим пользовательским свойствам
...
Рейтинг: 0 / 0
05.03.2012, 10:26
    #37691193
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
unknownfromrus,

Они привязываются от датаконтекста к свойствам контрола. А мне надо было наоборот. И поэтому я, собственно говоря, и не обратил внимания на это, так как все изменял контроловские свойства и думал, почему же биндинг не работает )
...
Рейтинг: 0 / 0
05.03.2012, 10:28
    #37691197
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragonunknownfromrus,
с самим TimeStruct и его свойствами все в порядке. К стандартным элементам все биндится замечательно )

Руки-крюки_ ,
и с датаконтекстом все в порядке)

Мда... как обычно сутки тратишь на поиск решения проблемы, а все лежит на поверхности) Не хватило "Mode = TwoWay" ) Видимо по умолчанию у юзерконтролов стоит OneWay.

Всем спасибо )

Ну у UserControl, a у DependencyProperty, если не указывать BindsTwoWayByDefault
...
Рейтинг: 0 / 0
05.03.2012, 10:43
    #37691214
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
SeVa,

спасибо за ссылочку. Будем использовать )
...
Рейтинг: 0 / 0
05.03.2012, 10:46
    #37691218
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
Sky Dragon,

Не совсем пока тебя понимаю.
Ты хотел привязать данные из свойств зависимостей к несвойствам зависимостей? Тогда не понятно, почему у тебя все прокатило. Дело в том, чтобы привязывать данные от свойств зависимостей не к совйствам зависимостей - необходимо использовать OneWayToSource (вроде бы так называется).
...
Рейтинг: 0 / 0
05.03.2012, 11:03
    #37691246
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UserControl и Binding к свойству
unknownfromrus,

Код: c#
1.
public static DependencyProperty HourProperty = DependencyProperty.Register("Hour", typeof(int), typeof(Clock), new PropertyMetadata((int)0, OnTimeChanged));



по всей видимости по умолчанию и стоит этот режим. (OneWayToSource ну или просто OneWay, не помню, кто из них в какую сторону). Честно говоря, углублятся в это пока нет времени.

по совету SeVы,

Код: c#
1.
public static DependencyProperty HourProperty = DependencyProperty.Register("Hour", typeof(int), typeof(Clock), new FrameworkPropertyMetadata((int)0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTimeChanged));



так гораздо лучше)
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / UserControl и Binding к свойству / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]