ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如果无法设置转换器参数,则IValueConverter维护状态

2019-06-29 23:56:13  阅读:153  来源: 互联网

标签:c wpf 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有