Вопрос

Есть ли хороший способ связать свойство с значением 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; }
}

Как только это будет в собственности, он будет использоваться с помощью привязки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top