Привязка константного члена в коде от xaml в WPF - PullRequest
9 голосов
/ 17 марта 2011

Есть ли какой-нибудь хороший способ связать свойство со значением const в codebehind?

Когда я использую 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;
}

Причина, по которой я выбрал этот способ, заключается в следующем:

  • В целях локализации строку Content не следует использовать для определениякакой элемент выбран при сохранении и загрузке последнего выбранного элемента.
  • Для простоты, XAML и выделенный код должны быть связаны внутренним идентификатором (в данном случае Uid).Таким образом, XAML и Code-behind могут поддерживаться отдельно.

Однако, с точки зрения обслуживания, внутренний идентификатор должен быть определен в одном месте следующим образом:

//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>

Итак, я хочу знать, как решить эту проблему.Или есть ли лучший способ реализовать это.Было бы тоже неплохо.

Best,

Ответы [ 2 ]

23 голосов
/ 17 марта 2011

Вам лучше использовать StaticExtension , например:

Uid="{x:Static local:YourClass.ID_foo}"

Где local - псевдоним xmlns для пространства имен C # вашего класса.Дополнительную информацию можно найти здесь .

Проблема использования Binding заключается в том, что вы добавляете много накладных расходов на то, что никогда не изменится.Привязка будет пытаться контролировать вашу собственность.Кроме того, существует известных «утечек» с использованием привязки со свойством не-зависимости для объекта, который не реализует INotifyPropertyChanged.

2 голосов
/ 17 марта 2011

Вам необходимо создать свойство, которое возвращает константу (определенную в const), то есть:

private const string ID_Foo = "foo";
public string FooId
{
   get { return ID_Foo; }
}

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

...