Silverlight: Как добавить свойство зависимости к нескольким элементам управления?

#silverlight #dependency-properties #attached-properties

#silverlight #зависимость-свойства #прикрепленные свойства

Вопрос:

Возможно ли создать свойство зависимости для нескольких элементов управления, не прибегая к подклассу каждого из них?

Я думал об использовании присоединенных свойств, но, насколько я понимаю, они вложены только на один уровень глубже.

Я хочу, чтобы что-то подобное было возможно:

 <!-- MyDataGrid implements the new Attached Properties SourceData and TargetData -->
<MyDataGrid>
  <StackPanel>
    <TextBox MyDataGrid.SourceData="{Binding Somewhere}" MyDataGrid.TargetData="{Binding Somewhere}" />
  </StackPanel>
  <CheckBox  MyDataGrid.SourceData="{Binding Somewhere}" MyDataGrid.TargetData="{Binding Somewhere}" />
</MyDataGrid>
  

Это не сработает, поскольку прикрепленные свойства не будут найдены в текстовом поле, поскольку оно не является прямым потомком MyDataGrid .

Предыстория в том, что я пытаюсь автоматически преобразовать старый синтаксис графического интерфейса, подобный Xaml, в реальный Xaml, и в старой системе было возможно устанавливать разные источники и целевые объекты для измененных данных. Сейчас я ищу Xaml-решение, которое не предполагает создания подклассов для каждого существующего элемента управления.

Заранее спасибо.

Ответ №1:

вы уверены, что правильно используете присоединенное свойство?

 public static readonly DependencyProperty SourceDataProperty = DependencyProperty.RegisterAttached(
            "SourceData", typeof (string), typeof (MyDataGrid), new PropertyMetadata("test"));

        public static void SetSourceData(DependencyObject obj, string sourceData)
        {
            obj.SetValue(SourceDataProperty, sourceData);
        }

        public static string GetSourceData(DependencyObject obj)
        {
            return (string) obj.GetValue(SourceDataProperty);
        }
  

У меня это сработало.Хотя SetSourceData не вызывался get, но данные там были.
Для повторного извлечения данных.

 MyDataGrid.GetSourceData(tbox);
  

Где tbox — это экземпляр вашего текстового поля.

Комментарии:

1. О боже. Да, конечно, в моем коде это была чистая бессмыслица. Большое спасибо. 🙂