2011-12-13 3 views
0

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

((TabItem)this.FindName("tabPatient")).IsEnabled = false; 

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

Есть ли способ сделать это?

Спасибо.

ответ

1

Вы можете перемещаться WPF-х VisualTree найти элемент по имени и задайте свойство.

Например, используя некоторые вспомогательные классы нашли here вы можете сказать

foreach(var s in controlList) 
{ 
    var ctrl = VisualTreeHelpers.FindChild<UIElement>(this, s); 
    if (ctrl != null) 
     ctrl.IsEnabled = false; 
} 

Вам не нужно знать тип управления. Все элементы управления с собственностью IsEnabled основаны на UIElement, поэтому просто введите управление как UIElement, чтобы изменить его IsEnabled.

+0

Вау, Рейчел, поговорим о всеобъемлющем. Мне нравится ответ H.B., поскольку это очень простой способ сделать то, что мне нужно, но вы действительно выбили его из парка с помощью своего подхода. Вы взяли микроаспект проблемы и решили макроскопические последствия. Ваш подход очень помогает в решении моей непосредственной проблемы и является пищей для размышлений для более глубокого понимания WPF, как я продолжаю учиться. Большое спасибо. – MikeMalter

+0

@MikeMalter Рад, что вы нашли это полезным :) Я часто хочу найти вещи в Visual Tree WPF и устал от копирования и вставки тех же методов в свой код, поэтому просто написал их все в мою библиотеку WPF – Rachel

2

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

var obj = FindName("name"); 
obj.GetType().GetProperty("IsEnabled").SetValue(obj, false); 

В качестве альтернативы можно использовать dynamic, который делает примерно то же самое:

dynamic dynObject = (dynamic)FindName("name"); 
dynObject.IsEnabled = false; 
+0

HB, спасибо за ответы, действительно круто и помог мне понять немного больше, что происходит. Это хороший ответ, и я получил результаты. Я заметил ответ Рэйчел как ответ на вопрос, потому что ее ответ не только решил немедленную проблему, но и обеспечил рамки для решения других навигационных вопросов WPF. Еще раз спасибо. – MikeMalter

+0

Добро пожаловать, рад, что это было полезно. –

Смежные вопросы