C#学习教程:在WPF中使用值转换器而不先将它们定义为资源既然我已经拥有并且是否不必在Window.Resources中声明trivialFormatter资源是不可能的,我可以直接从Button的宽度绑定中引用它?喜欢Converter={local:TrivialFormatter}感谢单例类型IValueConverter(例如,他们不需要当前绑定实例的任何状态)我使用静态转换器,即:Converter={x:StaticSomeNamespace:SomeConverter.Instance}博士。WPF还有一篇关于使用标记扩展使其更清晰的好文章。从技术上讲,我相信你可以做到这一点,但XAML太可怕了,相比之下,它会使“大量琐碎的资源”方法看起来像一个简单和清晰的避风港:我没有测试过这个,因为即使阅读它也会我的眼睛流泪了……我一定会检查Micah的建议,其中涉及使用转换器的静态单例实例。但另一件需要考虑的事情是,如果您使用像MVVM这样的独立表示模式,您通常可以通过在ViewModel中实现转换来避免对值转换器的需求。您可能出于多种原因想要这样做。首先,它更易于测试。您的单元测试可以确保ViewModel发出的内容就是UI将显示的内容。您可以想象测试一个要求,即美元值必须遵循当前文化的货币格式,必须使用两位小数等。另一个很好的理由是值转换器中的异常不被视为验证错误,这在Silverlight中可能是一个巨大的痛苦.即使您在绑定中将ValidatesOnExceptions设置为true,如果您的值转换器抛出异常,Silverlight也会让它传播。但是,如果使用ViewModel进行转换,则将异常视为验证错误。缺点是您失去了通用值转换器的一些“可重用性”。我不知道如何按照您所说的方式进行操作,但我只是将其作为示例进行了尝试并且它有效。在App.xaml.cs文件中,您可以创建一个使用反射来加载转换器的方法。privatevoidApplication_Startup(objectsender,StartupEventArgse){LoadConverters();}privatevoidLoadConverters(){foreach(vartinAssembly.GetExecutingAssembly().GetTypes()){if(t.GetInterfaces().Any(i=>i.Name=="IValueConverter")){Resources.Add(t.Name,Activator.CreateInstance(t));然后你可以像这样使用转换器,我猜是中途。您提出的方法的问题是Xaml解析器不知道您创建的转换器的时间和数量。将其创建为资源可确保只有一个实例。以上就是C#学习教程:在WPF中使用值转换器而无需先定义它们作为资源分享的全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
