9

有没有什么好方法可以将属性绑定到代码隐藏中的 const 值?

当我使用 ComboBox 时,我通常在 xaml 和后面的代码中这样做:

XAML:

<ComboBox Name="cbBuz">
   <ComboBoxItem Content="foo" Uid="foo" IsSelected="true" />
   <ComboBoxItem Content="bar" Uid="bar" />
</ComboBox>

代码隐藏:

ComboBoxItem item = cbBuz.GetSelectedItem();
switch (item.Uid)
{
    case "foo":  ... break;
    case "bar":  ... break;
}

我选择这种方式的原因如下:

  • 出于本地化目的,不应使用内容字符串来确定在保存和加载最后选择的项目期间选择了哪个项目。
  • 为简单起见,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;
}

问题似乎属性不能是 const 值,因此无法像这样将 ID_foo 和 ID_bar 绑定到 ComboBoxItem 的 Uid:

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

所以,我想知道如何解决这个问题。或者,有没有更好的方法来实现它。也会很好。

最好的,

4

2 回答 2

32

最好使用StaticExtension,如下所示:

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

其中 local 是类的 C# 命名空间的 xmlns 别名。更多信息可以在这里找到。

使用 Binding 的问题是您为永远不会改变的东西增加了很多开销。绑定将尝试监视您的财产。此外,在未实现 INotifyPropertyChanged 的​​对象上使用具有非依赖属性的绑定存在已知的“泄漏” 。

于 2011-03-16T22:55:14.290 回答
2

您需要创建一个返回常量(在 const 中定义)的属性,即:

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

一旦 this 在属性中,它将可以通过绑定使用。

于 2011-03-16T22:25:40.273 回答