Привязка к константному полю в Silverlight - PullRequest
5 голосов
/ 21 декабря 2009

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

Я хочу также иметь возможность повторно использовать эти значения в файлах XAML. Так что, если у меня есть такие константы, как это:

public class MyConstants
{
   public const string Constant1 = "Hello World";
}

Я хочу одним способом связать их с элементами управления, определенными в XAML, примерно так:

<TextBlock Text="{Binding MyConstants.Constant1}" />

Возможно ли это прямым путем? Я просмотрел обязательные примеры, но не могу найти такой сценарий.

Может быть, я мог бы сделать какую-то работу (возможно, привязки переведены в параметры для метода, который динамически вытягивает постоянное поле с помощью отражения)

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

Вот подход, который я бы выбрал: -

В XAML я бы использовал синтаксис StaticResource, например: -

<TextBlock Text="{StaticResource MyConstants_Constant1}" />

Создайте где-нибудь статический метод, который возвращает ResourceDictionary и принимает Type в качестве параметра. Функция использует рефлексию для перечисления набора открытых констант, которые она выставляет. Он добавляет строковое значение каждой константы к ResourceDictionary, формулирующему имя ключа из имени типа и имени Consts.

Во время запуска приложения передайте typeof(MyConstants) в эту функцию, добавьте возвращенный ResourceDictionaries в коллекцию в свойстве Application Resources MergedDictionaries.

Теперь все статические ресурсы должны разрешаться правильно, нет необходимости вызывать какую-либо привязку или устанавливать какой-либо datacontext, чтобы заставить это работать. Значение разрешается при разборе XAML.

4 голосов
/ 21 декабря 2009

Вы можете сделать это, но только если вы реализуете свойство, которое возвращает константу. Привязка работает только против свойств. Чтобы это работало, измените вашу декларацию на:

public class MyConstants
{
    private const string constant1 = "Hello World";
    public string Constant1 { get { return constant1; } }
}
1 голос
/ 02 января 2012

Если вы не возражаете против визуального дизайнера, я бы просто сделал

public MyConstants
{
    public static string Constant1 { get { return "Hello World"; } }
}

Здесь:

  1. static и getter-only делают его постоянным,
  2. и это также свойство, позволяющее выполнять привязку следующим образом.

    <TextBlock Text="{Binding MyConstants.Constant1}" />

Однако, как я уже сказал, это не отразится на Visual Designer (XAML) в Visual Studio, что очень жаль: -)

...