静态扩展值无法解析

73

我在使用WPF绑定到静态属性时遇到了一些问题。在我的应用程序中,有一个名为Globals的类,其中包含一个指向ThisAddIn静态属性。这个对象允许我访问一个用户属性,基本上就是我想在绑定中使用的东西。因此,我的XAML看起来像这样:

<TextBlock Text="{Binding Path=User.Name
                   , Source={x:Static Member=s:Globals.ThisAddIn}}" />

命名空间s在顶部通过以下行声明:

xmlns:s="clr-namespace:ConsoleApplication16.Model"

我发现了许多不同的方法来引用XAML中的静态属性,但除了这种方法之外(对我来说似乎也是最合理的),其他方法都没有生效。我发现一些示例根本没有使用Path或Member。

经过一些测试,我发现正确的方法是使用"x:Static Member"来定义类和您想要使用的静态属性,而Path则定义了此对象内部的正确属性,就像普通绑定一样。

尽管这个解决方案可以编译而没有任何问题,但是一个XAMLParseException弹出告诉我无法将StaticExtension值解析为枚举、静态字段或静态属性。


3
如果它抛出异常,那么这怎么能算是“正确的方式”呢? - H.B.
另外,您应该能够删除 Path=Member=,因为这将调用相应设置相关属性的构造函数。 - H.B.
我通常使用 {Binding Source={x:Static local:MyStaticClass.SomeStaticProperty.PropertyName} 绑定到静态类/属性。只需确保您的属性具有 get/set 访问器即可。例如,请确保您使用 public string PropertyName { get; set; } 而不是 public string PropertyName; - Rachel
@H.B. 你说得对,我不确定为什么要在那里放置 PropertyName{Binding PropertyName, Source={x:Static local:MyStaticClass.SomeStaticProperty} - Rachel
除了这个之外,其他都没用...路径定义了此对象内正确的属性。很抱歉,但这是无意义的。StaticExtension没有Path属性,而省略Member=是因为您提供的值是StaticExtension构造函数的参数,它只是将其设置为Member。阅读文档有助于理解,而不是随意尝试。编译没有任何投诉,直接弹出XAMLParseException - 您自相矛盾了。 - Jim Balter
显示剩余2条评论
3个回答

147

确保 Globals.ThisAddIn 是公共的。

如果您正在使用资源文件,则还需要确保访问修饰符设置为 Public

输入图像描述


10
明白了!设计时属性值被正确设置,但在运行时却因此异常而失败,这让人感到非常困惑。 - Steztric
1
哇塞,你说得对!我从没想过代码设计师能够在设计时访问我的资源,而编译会失败并显示“ExtensionValue无法解析”——就像@Steztric所写的一样。非常感谢! - Informagic
3
我来这里的原因是我的resx文件有内部修饰符。将其改为public就可以工作了。同样,在设计时它也能工作,非常令人困惑。 - Krzysztof Skowronek

41
在输出库项目中,您应确保将Resources.resx文件的生成器从默认的ResXFileGodeGenerator更改为PublicResXFileCodeGenerator。 用以下内容替换...

Not public resource

这个

correct public resource


0

有时候,即使考虑了上述的所有内容并且正确(尤其是将访问修饰符设置为public),在开发过程中添加资源(例如翻译字符串)时,新的资源会抛出异常,而同一资源的其他部分却可以正常工作。我经常遇到这种情况。

在这种情况下,可以尝试“清理”相应的项目并进行“重建”。 “清理”是撮合人!右键单击项目,从上下文菜单中选择“清理”。然后选择“重建”或“构建”。

这个方法几乎每次都对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接