Доступ и изменение элементов xaml с помощью Reflection в C # - PullRequest
2 голосов
/ 24 февраля 2012

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

Я создаю простое приложение для Windows Phone, которое предоставляет более легкодоступные версии этой информации на мобильный телефон. Я обнаружил, что в случае, если свойства модели выше не установлены, значение не отображается (отображается пустым), но метка по-прежнему отображается.

После рассмотрения ряда различных альтернатив для этого (включая огромное количество операторов if, тьфу) я решил, что если я задам имя для определенных атрибутов в xaml, чтобы соответствовать свойствам модели данных, на которую я смотрел Затем я в режиме реального времени имею систему анализировать свойства модели данных и элементы моего xaml. Если свойство в моем xaml совпадает с именем свойства в моей модели, а модель имеет нулевое значение, я могу сделать видимость свернутой. Если модель не была нулевой, сделайте ее видимой. Таким образом, у меня могло быть чистое, динамическое решение, которое показывало бы только те данные, которые действительно доступны.

Вот код

PropertyInfo[] properties = data.GetType().GetProperties();

foreach (PropertyInfo property in properties)
{

    FieldInfo view = this.GetType().GetField(property.Name);

    if (view != null)
    {
        if (property.GetValue(data, null) == null)
        {
            object aView = view.GetValue(this);
            aView.GetType().GetProperty("Visibility").SetValue(aView, "Collapsed", null);
        }
        else
        {
            object aView = view.GetValue(this);
            aView.GetType().GetProperty("Visibility").SetValue(aView, "Visible", null);
        }
    }
}

К сожалению, я попал в ловушку. Я не могу понять, как получить доступ к элементам xaml. Я пытался использовать

this.GetType().GetProperties()
this.GetType().GetFields()
this.GetType().GetMembers()

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

Есть ли лучший способ сделать это, что красивее?

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

Если вы назвали элементы в вашем XAML следующим образом:

<Grid>
  <TextBlock x:Name="txt" />
</Grid>

Вы можете найти их с помощью метода FindName :

TextBlock txt = this.FindName("txt") as TextBlock;

Отражение не требуется!

1 голос
/ 24 февраля 2012

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

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

Вот пример - http://digitalmoto.net/blog/2011/02/28/null-object-to-visibility-converter/

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