如何确保为每个使用的绑定创建了一个值转换器的新实例?WPF每个绑定实例的值转换器?
回答
您需要在转换器资源指定x:Shared="False"
。这里是一个例子:
<BooleanToVisibilityConverter x:Key="MyConverter" x:Shared="False"/>
您可以在每个控制单独的资源:
<TextBox>
<TextBox.Resources>
<Converters:VisibilityConverter x:Key="conv"/>
</TextBox.Resources>
<TextBox.Text>
<Binding Converter="{StaticResource conv}"/>
</TextBox.Text>
</TextBox>
为什么?它应该是确定性的,并且不知道除了通过参数传递给它的任何状态。我已经使用了值转换器来保存图像的静态列表(将值转换为图像),并且工作正常 - 即使在具有数千行的数据网格的多个列中使用相同的转换器时也是如此。 (请注意,转换器仍不知道任何外部状态)。
在任何情况下,看是否能回答你的问题:Are value converters instantiated per-binding in WPF?
我需要一个转换器来绑定两个可观察的集合或稍微不同的类型。我跟踪转换器中收集已更改的事件。因此每个实例。 – NVM 2011-03-02 11:31:27
如果你把你的转换器转化为资源,并通过{StaticResource ConverterName}
查找引用它们,那么他们每个实例化资源字典的情况只有一次。
但是更好的方法是从MarkupExtension
继承您的转换器,并直接使用它们,而不是将它们添加到资源并引用它们。
下面是这样一个基类的一个实例:
http://www.snippetsource.net/Snippet/18/base-class-for-valueconverters-in-wpf
问候 基督教
链接已死,请更新,如果它仍然存在 – Maslow 2017-02-16 13:36:22
从MarkupExtension
继承,然后创建在构造函数中的转换器。
public override object ProvideValue(IServiceProvider serviceProvider)
{
_converter = new FlagsToBoolConverter();
return _converter;
}
下面是一个完整的例子。它是一个需要实例化的标志转换器,以保留ConvertBack的源值。
using System;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace Something
{
public class FlagsToBoolConverter : MarkupExtension, IValueConverter
{
private FlagsToBoolConverter _converter;
public override object ProvideValue(IServiceProvider serviceProvider)
{
_converter = new FlagsToBoolConverter();
return _converter;
}
private ulong _sourceValue;
public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
var type = value.GetType();
if (type.IsEnum)
{
ulong mask = (ulong)System.Convert.ChangeType(Enum.Parse(type, (string)parameter), typeof(ulong));
_sourceValue = (ulong)System.Convert.ChangeType(Enum.Parse(type, value.ToString()), typeof(ulong));
return ((mask & _sourceValue) != 0);
}
return value;
}
catch (Exception ex)
{
Console.WriteLine("FlagsEnumValueConverter: Invalid Cast(to) Value={0} Type={1} Param={2} Exception{3}", value, targetType, parameter, ex);
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
if (targetType.IsEnum)
{
var original = this._sourceValue;
var originalEnum = Enum.Parse(targetType, original.ToString());
var maskEnum = Enum.Parse(targetType, (string)parameter);
var mask = (ulong)System.Convert.ChangeType(maskEnum, typeof(ulong));
_sourceValue ^= mask;
var sourceEnum = Enum.Parse(targetType, _sourceValue.ToString());
Console.WriteLine($"Modified Value: {original} ({originalEnum}) by Mask {mask} ({maskEnum}) Result = {_sourceValue} ({sourceEnum})");
return sourceEnum;
}
return value;
}
catch (Exception ex)
{
Console.WriteLine("FlagsEnumValueConverter: Invalid Cast(from) Value={0} Type={1} Param={2} Exception{3}", value, targetType, parameter, ex);
}
return value;
}
}
}
您的前缀需要声明为xmlns:src="clr-namespace:Something"
。然后在你的绑定与Converter={src:FlagsToBoolConverter}
<CheckBox IsChecked="{Binding SomeFlagsEnum, ConverterParameter=FlagA, Converter={src:FlagsToBoolConverter}}">FlagA</CheckBox>
<CheckBox IsChecked="{Binding SomeFlagsEnum, ConverterParameter=FlagB, Converter={src:FlagsToBoolConverter}}">FlagB</CheckBox>
<CheckBox IsChecked="{Binding SomeFlagsEnum, ConverterParameter=FlagC, Converter={src:FlagsToBoolConverter}}">FlagC</CheckBox>
- 1. 值转换器是否在WPF中通过绑定实例化?
- 2. WPF绑定转换器
- 3. WPF转换器从绑定
- 4. WPF绑定和转换器
- 5. WPF从System.Windows.SystemParameters.PrimaryScreenWidth绑定一个转换器
- 6. 有没有办法将WPF绑定标记转换为绑定类的实例?
- 7. WPF - 按钮IsEnabled绑定转换器
- 8. WPF绑定转换器集合
- 9. WPF绑定ObservableCollection与转换器
- 10. 传递多个绑定值作为绑定转换器参数
- 11. 布尔转换器在WPF中的多个绑定
- 12. Aurelia动态绑定价值转换器
- 13. 将UI值绑定到WPF中模型的对象实例
- 14. WPF设计器绑定与转换器抛出对象引用未设置为对象的实例
- 15. WPF绑定:值
- 16. 绑定转换器和多重绑定
- 17. WPF:绑定到转换对象失败!
- 18. WPF与显式转换绑定
- 19. WPF - 使用当前绑定的转换器的正确语法
- 20. Mvvm xaml绑定转换器无法转换值错误
- 21. wpf如何使用转换器进行多重绑定的子绑定?
- 22. 绑定在转换器?
- 23. 与转换器绑定
- 24. Silverlight绑定转换器
- 25. WPF - 使用返回一行的转换器绑定一行
- 26. WPF MultiBinding具有不同绑定路径的相同转换器
- 27. WPF是否有一组可用的默认绑定转换器?
- 28. WPF转换器可以访问它绑定到的控件吗?
- 29. 对于转换器不工作的WPF绑定
- 30. 每个实例事件绑定的骨干
帕夫洛取代普通转换器你是男人! – NVM 2011-03-02 11:31:57