C# 从WPF中的xaml在代码隐藏中绑定常量成员

C# 从WPF中的xaml在代码隐藏中绑定常量成员,c#,wpf,bind,uid,C#,Wpf,Bind,Uid,在codebehind中有没有什么好方法可以将属性绑定到常量值 当我使用ComboBox时,我通常在xaml和代码隐藏中这样做: XAML: 我选择这种方式的原因如下: 出于本地化目的,不应使用内容字符串来确定在保存和加载最后选定的项目期间选择了哪个项目 为简单起见,XAML和代码隐藏应该连接到内部标识符(在本例中为Uid)。因此,XAML和代码隐藏可以单独维护 但是,在维护方面,内部标识符应定义在如下位置: //IDs public const string ID_foo = "foo";

在codebehind中有没有什么好方法可以将属性绑定到常量值

当我使用ComboBox时,我通常在xaml和代码隐藏中这样做:

XAML:

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

  • 出于本地化目的,不应使用内容字符串来确定在保存和加载最后选定的项目期间选择了哪个项目
  • 为简单起见,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;
}
//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>
问题在于属性不能是常量值,因此无法将ID\u foo和ID\u bar绑定到ComboBoxItem的Uid,如下所示:

//IDs
public const string ID_foo = "foo";
public const string ID_bar = "bar";

...

//
switch (item.Uid)
{
    case ID_foo:  ... break;
    case ID_bar:  ... break;
}
//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>
//如果ID\u foo和ID\u bar是属性,这将起作用。
所以,我想知道如何解决这个问题。 或者,有没有更好的方法来实施它。那也很好


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


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

您最好使用,如下所示:

Uid="{x:Static local:YourClass.ID_foo}"
其中local是类的C#名称空间的xmlns别名。可以找到更多信息


使用绑定的问题是,您为一些永远不会改变的东西增加了很多开销。绑定将尝试监视您的属性。另外,在未实现INotifyPropertyChanged的对象上使用具有非依赖属性的绑定也存在一些问题。

哦,没错。有没有办法把这个缩短?我的意思是,如果它是C++,我们可以使用“y-”定义来生成宏,但我们不能。我想知道,当向ComboBox添加新Uid时,IValueConverter和Enum是否可以缩短此长度,而不是整个代码量。@Aki24x:您可以通过IValueConverter并在XAML中指定一个值作为常量(而不是通过绑定)来完成此操作。这将允许单个IValueConverter以某种方式进行查找,但您需要它查找一些内容,例如:字典中的名称,或使用枚举,或…非常感谢!这正是我想要的!此外,与泄漏和开销相关的信息非常有用。专业提示:当常量为数字时,请确保类型匹配。我尝试使用int并尝试在XAML中设置System.Windows.FrameworkElement.Height(双精度),但它给了我一个XamlParseException:“23”不是属性“Height”的有效值。”
Uid="{x:Static local:YourClass.ID_foo}"