Tag: 标记扩展

动态枚举转换器

我想为我的应用程序中的所有可能的枚举创建一个动态双向转换器。 我不想为每个枚举创建转换器,我想创建一个转换器,它提供从枚举到字节的转换,从字节到枚举,反之亦然。 我要怎么去那儿? 我的方法已经是双向的,但在代码中需要静态强制转换(MyEnum) : public class MyEnumConverter : MarkupExtension, IValueConverter { public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) { return (MyEnum)value; } public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) { return (byte)value; } public override object ProvideValue(System.IServiceProvider serviceProvider) { return this; } }

带有标记扩展名的字符串格式

我试图使string.Format在WPF中作为一个方便的函数可用,这样各种文本部分可以组合在纯XAML中,而不需要代码隐藏的样板。 主要问题是支持函数的参数来自其他嵌套标记扩展(例如Binding )的情况。 实际上,有一个function非常接近我需要的function: MultiBinding 。 不幸的是,它只能接受绑定 ,但不能接受其他动态类型的内容,比如DynamicResource 。 如果我的所有数据源都是绑定,我可以像这样使用标记: 有明显的StringFormatConveter实现。 我试图实现自定义标记扩展,以便语法如下: 或者只是 但是我坚持执行ProvideValue(IServiceProvider serviceProvider) ,因为参数是另一个标记扩展。 互联网上的大多数例子都是微不足道的:它们要么根本不使用serviceProvider ,要么查询IProvideValueTarget ,它们(大多数)说的是什么依赖属性是标记扩展的目标。 在任何情况下,代码都知道在ProvideValue调用时应该提供的值。 但是, ProvideValue只会被调用一次( 模板除外 ,这是一个单独的故事),因此如果实际值不是常数(如Binding等),则应该使用另一种策略。 我在Reflector中查找了Binding的实现,它的ProvideValue方法实际上并不返回真正的目标对象,而是一个System.Windows.Data.BindingExpression类的实例,它似乎可以完成所有实际工作。 DynamicResource :它只返回一个System.Windows.ResourceReferenceExpression实例,该实例关注订阅(内部) InheritanceContextChanged并在适当时使值无效。 通过查看代码我无法理解的是: BindingExpression / ResourceReferenceExpression类型的对象如何不按“原样”处理,但是被要求提供基础值? MultiBindingExpression如何知道底层绑定的值已经改变,所以它也必须使其值无效? 我实际上发现了一个标记扩展库实现,声称支持连接字符串(完全映射到我的用例)( 项目 , 代码 ,依赖于其他代码的连接实现 ),但它似乎只支持嵌套扩展库类型(即,你不能在里面嵌套一个vanilla Binding )。 有没有办法实现问题顶部的语法? 它是受支持的场景,还是只能从WPF框架内部执行此操作(因为System.Windows.Expression有内部构造函数)? 实际上我使用自定义隐形辅助UI元素实现了所需的语义 : (其中FormatHelper跟踪其子项及其依赖项属性更新,并将最新结果存储到Value ),但这种语法似乎很难看,我想摆脱可视树中的帮助项。 最终的目标是促进翻译:像“15秒直到爆炸”之类的UI字符串自然地表示为可本地化的格式“{0}直到爆炸”(进入ResourceDictionary并在语言改变时被替换)并Binding到表示时间的VM依赖项属性。 更新报告 :我尝试使用我在互联网上找到的所有信息来实现标记扩展。 完全实现在这里( [1] , [2] , […]

从代码中设置自定义MarkupExtension

如何从代码中设置自定义MarkupExtension ? 您可以轻松地从Xaml设置。 Binding和DynamicResource 。 通过代码设置相同的值需要一些不同的方法 绑定:使用textBox.SetBinding或BindingOperations.SetBinding Binding binding = new Binding(“MyFontSize”); BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, binding); DynamicResource:使用SetResourceReference textBox.SetResourceReference(TextBox.StyleProperty, “MyStyle”); CustomMarkup:如何从代码中设置自定义MarkupExtension ? 我应该调用ProvideValue吗?如何调用IServiceProvider ?* CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??); 我在这个问题上发现了很少,所以可以做到吗? HB回答了这个问题。 只是在这里添加一些细节,为什么我想这样做。 我试图为以下问题创建一个解决方法。 问题是你无法从Binding派生并覆盖ProvideValue因为它是密封的。 您将不得不这样做: 自定义WPF绑定标记扩展的基类 。 但问题是当你将Binding返回到Setter会得到一个exception,但是在Style之外它可以正常工作。 我已经在几个地方读过你应该返回MarkupExtension本身,如果TargetObject是一个Setter ,一旦它被应用到一个实际的FrameworkElement就允许它重新进行revavuate,这是有道理的。 数据触发器中的标记扩展 MarkupExtension的巨大限制 自定义WPF绑定标记扩展的基类 (在注释中) 但是,仅当TargetProperty是object类型时才有效,否则返回exception。 如果你看一下BindingBase的源代码,你可以看到它确实如此,但看起来框架有一些秘密成分使它工作。

从WPF自定义MarkupExtension访问“当前类”

我试图通过给我一个更好的方法在XAML中指定绑定来编写自定义MarkupExtension以使我的生活更轻松。 但是,我想知道是否有任何方法可以访问表示使用MarkupExtension的文件的对象。 换句话说,假设我有一个UserControl定义了我的程序的数据模型的特定再现。 这个控件有很多视觉材料,如网格,边框和总体布局。 如果我在这个UserControl的某个元素的特定属性上使用我的MarkupExtension ,我想访问UserControl的实例,而不知道它是什么类型(我计划使用reflection)。 这是可能吗?

如何解决MarkupExtension中数据绑定的值?

我已经为基于键的字符串翻译做了标记扩展。 例 现在我希望能够使用嵌套绑定来提供我的密钥。 例: 当我这样做时,我得到一个System.Windows.Data.Binding对象。 通过调用ProvideValue并传递ServiceProvider,我可以得到一个BindingExpression: var binding = Key as Binding; if (binding == null) { return null; } var bindingExpression = binding.ProvideValue(_serviceProvider) as BindingExpression; if (bindingExpression == null) { return null; } var bindingKey = bindingExpression.DataItem; 我可以获得此bindingExpression,但DataItem属性为null。 我已经像这样测试了我的绑定 它工作正常。 有任何想法吗?