c# – 如果无法设置转换器参数,则IValueConverter维护状态
作者:互联网
我有一个IValueConverter,它通过查找表将枚举值转换为本地化字符串,反之亦然.要找到正确的表,首先需要知道表的名称.当枚举值通过Convert方法传递到转换器时,可以找到它.当字符串通过ConvertBack方法传递到转换器时,它不是(枚举类型是唯一的,但字符串值不是).
转换器用于DataTemplates,用于数据网格和属性网格中使用的编辑器.
在一种情况下,可以将表的名称作为ConverterParameter传递,因为DataTemplate是动态生成的.在另一方面,似乎不可能这样做.我当前的解决方案在Convert方法中查找表名并存储它以用于ConvertBack方法(即IValueConverter维护对Convert和ConvertBack的调用之间的状态).这假设转换将始终在ConvertBack之前调用,这似乎不是一个安全的假设.我正在使用转换器的每个绑定实例:
<converters:EnumToStringConverter x:Key="EnumToStringConverter" x:Shared="False"/>
这样安全还是会回来困扰我?转换器方法如下所示:
private string listName = null;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter == null)
{
parameter = ListManager.FindListNameFromObject(value);
}
listName = (string)parameter;
return ListManager.GetKeyFromValue((string)parameter, value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter == null)
{
parameter = listName;
}
return ListManager.GetValueFromKey((string)parameter, (string)value);
}
我一直试图看看是否可能的替代方法是在转换器上创建依赖属性,并以某种方式将其绑定到集合的名称.有没有办法将转换器的DataContext设置为与它所作用的绑定相同?目前转换器是一个StaticResource,因此没有DataContext.
谢谢
解决方法:
转换器不允许是WPF中的DependencyObjects,因为它们无法提供可能动态更改的属性.
下面的代码将Key转换为Value&使用动态绑定字典的值的值.
XAML
<StackPanel>
<StackPanel.Resources>
<FrameworkElement x:key="ProxyElement"
DataContext="{Binding}" />
</StackPanel.Resources>
<ContentControl Visibility="Collapsed"
DataContext="{Binding MyDictionary}"
Content="{StaticResource ProxyElement}" />
<TextBox Text="{Binding Key,
Converter={StaticResource MyConverter},
ConverterParameter={StaticResource ProxyElement}}"/>
</StackPanel>
C#
public class MyConverter : IValueConverter
{
object Convert(value, parameter ..)
{
var dict
= ((FrameworkElement)parameter).DataContext
as Dictionary<string, string>)parameter;
return (dict[value.ToString()];
}
object ConvertBack (value, parameter ..)
{
var dict
= ((FrameworkElement)parameter).DataContext
as Dictionary<string, string>)parameter;
foreach(var item in dict)
{
if (item.Value == value)
{
return item.Key;
}
}
}
}
标签:c,wpf,ivalueconverter 来源: https://codeday.me/bug/20190629/1330992.html