Привязывающий член const в коде от XAML в WPF
Вопрос
Есть ли хороший способ связать свойство с значением COND в кодовом обороте?
Когда я использую ComboBox, я обычно делаю это в XAML и код позади:
Xaml:
<ComboBox Name="cbBuz">
<ComboBoxItem Content="foo" Uid="foo" IsSelected="true" />
<ComboBoxItem Content="bar" Uid="bar" />
</ComboBox>
CodeBehind:
ComboBoxItem item = cbBuz.GetSelectedItem();
switch (item.Uid)
{
case "foo": ... break;
case "bar": ... break;
}
Причина, по которой я выбрал этот путь, следующая:
- Для целей локализации строка контента не следует использовать для определения того, какой элемент выбран во время сохранения и загрузки последнего выбранного элемента.
- Для простоты XAML и код-бенд должны быть подключены внутренним идентификатором (в данном случае UID). Так что XAML и код-бензин можно поддерживать отдельно.
Тем не менее, с точки зрения обслуживания, внутренний идентификатор должен быть определен на одном месте, как это:
//IDs
public const string ID_foo = "foo";
public const string ID_bar = "bar";
...
//
switch (item.Uid)
{
case ID_foo: ... break;
case ID_bar: ... break;
}
Проблема в том, что свойство не может быть постоянным значением, поэтому нет способа привязать ID_FOO и ID_BAR с UID ComboBoxItem, как это:
//If ID_foo and ID_bar are properties, this will work.
<ComboBox Name="cbBuz">
<ComboBoxItem Content="foo" Uid="{Binding ID_foo}" IsSelected="true" />
<ComboBoxItem Content="bar" Uid="{Binding ID_bar}" />
</ComboBox>
Итак, я хочу знать, как решить эту проблему. Или есть ли лучший способ его реализации. Это тоже было бы хорошо.
Лучший,
Решение
Вам было бы лучше использовать Статикекста, вот так:
Uid="{x:Static local:YourClass.ID_foo}"
Где локальный псевдоним XMLNS для пространства имен C# вашего класса. Больше информации можно найти здесь.
Проблема с использованием привязки заключается в том, что вы добавляете много накладных расходов для чего -то, что никогда не изменится. Переплет будет попытаться контролировать вашу собственность. Также есть известные "утечки" с использованием привязки со свойством беззависимости на объекте, который не реализует inotifypropertychanged.
Другие советы
Вам нужно сделать свойство, которое возвращает константу (определяется в константе), т.е.
private const string ID_Foo = "foo";
public string FooId
{
get { return ID_Foo; }
}
Как только это будет в собственности, он будет использоваться с помощью привязки.