4

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

该转换器在 DataTemplates 上用于数据网格和属性网格中使用的编辑器。

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

<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 设置为与其作用的绑定相同?目前,转换器是一个静态资源,因此没有 DataContext。

谢谢

4

2 回答 2

5

Converters不允许DependencyObject在 WPF 中使用 s,因为它们无法为其可能动态更改的属性提供投标。

下面的代码将 a 转换KeyValue&Value使用Key动态绑定Dictionary

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;
            }
        }
     }
 }
于 2012-10-25T11:24:44.313 回答
0

您总是可以将您的值绑定到“。” 然后,这将在转换器中为您提供 DataContext,然后您可以将状态保留在该对象中。

于 2012-10-25T09:51:11.007 回答