#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. О боже. Да, конечно, в моем коде это была чистая бессмыслица. Большое спасибо. 🙂