Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Отсутствие метода OverrideMetadata()

Читайте также:
  1. Алгоритм метода ветвей и границ
  2. Алгоритмы метода Монте-Карло для решения интегральных уравнений второго рода.
  3. Биомикроскопия. Клинические возможности метода.
  4. Блок Отсутствие товара
  5. В поисках метода
  6. В случае если, в отсутствие вины Арендодателя, Арендатор не предоставит какие-либо документы, необходимые для государственной регистрации настоящего Договора.
  7. В чем преимущества этого метода?

WPF позволяет переопределять метаданные зависимых свойств при помощи метода OverrideMetadata объекта DependencyProperty. В следующем коде переопределяется ширина по умолчанию у элемента управления, наследованного от класса Control:

1: static MyControl() 2: { 3: FrameworkPropertyMetadata newMetadata 4: = new FrameworkPropertyMetadata(); 5: newMetadata.DefaultValue = 180.0; 6: Control.WidthProperty.OverrideMetadata(typeof(MyControl), 7: newMetadata); 8: }

Так как в Silverlight такой метод отсутствует, при необходимости изменить значение по умолчанию какого-либо свойства, необходимо просто установить это значение в конструкторе:

1: public MyControl() 2: { 3: this.Width = 180; 4: }

Другая возможность метода OverrideMetadata() – это задание обработчика изменения зависимого свойства базового класса:

1: static MyControl() 2: { 3: #if!SILVERLIGHT 4: FrameworkPropertyMetadata newMetadata 5: = new FrameworkPropertyMetadata(); 6: newMetadata.PropertyChangedCallback 7: += MyControl.VisibilityProperty_Changed; 8: Control.VisibilityProperty.OverrideMetadata(9: typeof(MyControl), newMetadata); 10: #endif 11: }

После этого в методе VisibilityProperty_Changed можно обрабатывать все изменения зависимого свойства Visibility.

1: private static void VisibilityProperty_Changed(2: DependencyObject d, DependencyPropertyChangedEventArgs e) 3: { 4: // do something here 5: }

К сожалению, т.к. данного метода в Silverlight нет совсем, изящного решения данной проблемы не существует. Однако можно воспользоваться не очень чистым приемом, включающим определение дополнительного зависимого свойства и привязку исходного свойства к нему. Аналог приведенного выше примера для Silverlight приложения в таком случае будет выглядеть следующим образом:

1: #if SILVERLIGHT 2: // объявление дополнительного зависимого свойства, которое 3: // использует такой же PropertyChangedCallback, что и WPF код 4: private static readonly DependencyProperty 5: VisibilityChangedWorkaroundProperty 6: = DependencyProperty.Register(7: "VisibilityChangedWorkaround", typeof(Visibility), 8: typeof(MyControl), 9: new PropertyMetadata(MyControl.VisibilityProperty_Changed)); 10: #endif 11: 12: public MyControl() 13: { 14: #if SILVERLIGHT 15: // привязка дополнительного зависимого свойства 16: Binding visibilityBnd = new Binding("Visibility"); 17: visibilityBnd.Source = this; 18: visibilityBnd.Mode = BindingMode.TwoWay; 19: this.SetBinding(20: MyControl.VisibilityChangedWorkaroundProperty, 21: visibilityBnd); 22: #endif 23: }

Как видно из примера, определено дополнительное зависимое свойство VisibilityChangedWorkaroundProperty, и в качестве её обработчика изменения указан тот же метод, что и в WPF коде, приведенном выше. Нет необходимости создавать CLR свойство-обертку для дополнительного свойства, и само дополнительное зависимое свойство определено как приватное, так что оно доступно только внутри класса и невидимо для внешних компонент.

Затем в конструкторе дополнительное свойство привязывается к свойству Visibility базового класса. Таким образом, когда свойство базового класса изменится, дополнительное свойство также будет изменено в результате срабатывания привязки, после чего будет вызван обработчик VisibilityProperty_Changed.


Дата добавления: 2015-08-13; просмотров: 103 | Нарушение авторских прав


Читайте в этой же книге: Класс модели представления (View Model). | Реализация INotifyCollectionChanged. | Создание представления, определенного как шаблон данных. | Краткие итоги | В паттерне MVVM инкапсулирует логику представления и данные для отображения (англ. яз.). | Интерфейс, предоставляющий базовую поддержку валидации данных и сообщения об ошибках | Шаг 4. View | Шаг 4. Редактирование | Шаг 5. Команды | Создание ссылок на XAML файлы |
<== предыдущая страница | следующая страница ==>
Синхронное использование XAML| Отсутствие свойства No PathSegment.IsStroked

mybiblioteka.su - 2015-2024 год. (0.007 сек.)