WPF Reflection, Позднее связывание - PullRequest
0 голосов
/ 27 мая 2011

Я пытаюсь установить свойства для элементов управления WPF (высота, ширина, вес шрифта, поля и многие другие) из данных, которые читаются через файл XML. Я не буду знать, какие свойства будут установлены заранее. Мне было интересно, если кто-нибудь знает способ сделать это с помощью отражения?

На данный момент мне удалось назначить все примитивные типы и типы перечислений с помощью отражения, но у меня возникли небольшие проблемы со свойствами, такими как FontWeight, Margin, Background и многими другими, которые требуют других Объекты в настройке свойства, например: Чтобы установить FontWeight свойство кнопки, вы должны сделать это следующим образом.

button.FontWeight = Fontweights.Bold;

или маржа

button.Margin = new Thickness(10, 10, 10, 10);

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

public void setProperties(String propertyName, string PropertyValue
{

     if(propertyName = "Margin")
     {
         Set the margin.....
     }
     else if (propertyName = "FontWeight")
     {
         set the FontWeight....
     }
}

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

Ответы [ 3 ]

1 голос
/ 28 мая 2011

За кулисами XAML использует TypeConverter s для преобразования строки в указанный тип. Вы можете использовать их самостоятельно, поскольку каждый из упомянутых вами типов имеет значение по умолчанию TypeConverter, указанное с помощью TypeConverterAttribute. Вы можете использовать его следующим образом (или, альтернативно, сделать метод универсальным):

object Convert(Type targetType, string value)
{
    var converter = TypeDescriptor.GetConverter(targetType);
    return converter.ConvertFromString(value);
}

Тогда каждое из следующих действий работает как ожидалось:

Convert(typeof(Thickness), "0 5 0 0")
Convert(typeof(FontWeight), "Bold")
Convert(typeof(Brush), "Red")
1 голос
/ 15 июня 2011

Это на самом деле очень просто. Вы считываете свои строковые значения в свойствах ViewModel, устанавливаете эту модель представления в свой DataContext и в xaml связываете свои свойства. Привязка использует TypeConverters автоматически y.

0 голосов
/ 27 мая 2011

Вы можете сделать что-то вроде этого

typeof(Button).GetProperty("FontWeight").SetValue(button1,GetFontWeight("Bold"), null);

РЕДАКТИРОВАТЬ:

У вас может быть функция отображения, которая преобразует строку в значение свойства

FontWeight GetFontWeight(string value)
{

   swithc(value)
   {
     case "Bold" : return FontWeights.Bold; break;
     ...
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...