gpt4 book ai didi

c# - 如果无法设置转换器参数,IValueConverter 保持状态

转载 作者:太空狗 更新时间:2023-10-30 01:07:17 25 4
gpt4 key购买 nike

我有一个 IValueConverter,它通过查找表将枚举值转换为本地化字符串,反之亦然。要找到正确的表,它首先需要知道表的名称。当枚举值通过 Convert 方法传递到转换器时,可以找到它。当字符串通过 ConvertBack 方法传递到转换器时,它不是(枚举类型是唯一的,但字符串值不是)。

转换器用于数据网格和属性网格中使用的编辑器的数据模板。

在一种情况下,可以将表的名称作为 ConverterParameter 传递,因为 DataTemplate 是动态生成的。另一方面,似乎不可能做到这一点。我当前的解决方案在 Convert 方法中查找表名并将其存储以供在 ConvertBack 方法中使用(即 IValueConverter 在调用 Convert 和 ConvertBack 之间维护状态)。这假定 Convert 将始终在 ConvertBack 之前被调用,这似乎不是一个安全的假设。我正在使用转换器的每个绑定(bind)实例:

<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);
}

我一直在尝试查看是否可行的替代方法是在转换器上创建一个依赖属性,并以某种方式将其绑定(bind)到集合的名称。有没有办法将转换器的 DataContext 设置为与其作用的绑定(bind)相同?目前转换器是 StaticResource,因此没有 DataContext。

谢谢

最佳答案

Converters 不允许是 WPF 中的 DependencyObject,因为它们无法为其可能动态更改的属性提供出价。

下面的代码使用动态绑定(bind)的 Dictionary< 将 Key 转换为 Value 并将 Value 转换为 Key/.

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# - 如果无法设置转换器参数,IValueConverter 保持状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com