【问题标题】:WPF ComboBox Binding with ConverterWPF ComboBox 与转换器绑定
【发布时间】:2014-12-11 20:29:29
【问题描述】:

好的,这就是交易。 我有一个 CollectionViewSource:

<CollectionViewSource x:Key="PA_System_AppStatus">
    <CollectionViewSource.Source>
        <SystemCols:ArrayList>
            <ComboBoxItem Content="Active" />
            <ComboBoxItem Content="Denied" />
            <ComboBoxItem Content="Granted" />
        </SystemCols:ArrayList>
    </CollectionViewSource.Source>
</CollectionViewSource>

我还绑定了一个 ComboBox:

                <ComboBox x:Name="Perro" Tag="Application"
                          SelectedValue="{Binding Path=[AppStatus], Converter={StaticResource AppStatusConverter}}"
                          ItemsSource="{Binding Source={StaticResource PA_System_AppStatus2}}"/>

AppStatus 是 DataRow 中的一个字符,可能是 A、D、G。 因此,我希望 ComboBox 在上面显示整个 ComboBoxItem,但在字段中存储 char。为此,我写了这个转换器:

 public class AppStatusConverter : IValueConverter
    {
        public object Convert(
            object value,
            System.Type targetType,
            object parameter,
            System.Globalization.CultureInfo culture
            )
        {
            string returnValue = null;

            if (value != System.DBNull.Value && value != null)
            {
                if ((string)value == "A")
                    returnValue = "Active";
                else if ((string)value == "D")
                    returnValue = "Denied";
                else if ((string)value == "G")
                    returnValue = "Granted";
                else
                    returnValue = null;
            }
            return returnValue;
        }

        public object ConvertBack(
            object value,
            System.Type targetType,
            object parameter,
            System.Globalization.CultureInfo culture
            )
        {
            string returnValue = null;

            string tempvalue = ((ComboBoxItem)value).Content.ToString();

            if (tempvalue == "Active")
                returnValue = "A";
            else if (tempvalue == "Denied")
                returnValue = "D";
            else if (tempvalue == "Granted")
                returnValue = "G";

            else
                returnValue = null;

            return returnValue;
        }
    }

ConvertBack 部分完美运行,每当我选择一个值时,DataRow 都会被其中一个字符(A、D 或 G)填充。

但是,Convert 没有。例如,我从数据库加载一个 DataRow。然后,转换器正确地获取“Ap​​pStatus”列中的值,并尝试将其转换为选择组合框项目之一并分配 SelectedValue。但是,什么都没有发生。

【问题讨论】:

    标签: c# wpf combobox collectionviewsource


    【解决方案1】:

    问题似乎在于您正在从转换器返回一个字符串值,但 ItemsSource 是一个填充有 ComboBoxItems 的 ArrayList,因此它会检查引用是否相同。尝试使用字符串值而不是 ComboBoxItems 填充您的 ArrayList。您可以为此使用普通的字符串数组:

    <x:Array Type="sys:String">
      <sys:String>Active</sys:String>
      <sys:String>Denied</sys:String>
      <sys:String>Granted</sys:String>
    </x:Array>
    

    添加系统命名空间的位置:xmlns:sys="clr-namespace:System;assembly=mscorlib" 然后,您可以按如下方式简化转换器:

    转换:

    {
      if (!(value is char)) return null;
      char c = (char)value;
    
      switch (c)
      {
        case 'A': return "Active";
        case 'D': return "Denied";
        case 'G': return "Granted";
      }
    
      return null;
    }
    

    转回:

    {
      string sVal = value as string;
      if (string.IsNullOrEmpty(sVal)) return null;
    
      switch (sVal)
        {
          case "Active": return 'A';
          case "Denied": return 'D';
          case "Granted": return 'G';
        }
    
        return null;
    }
    

    【讨论】:

    • 刚刚测试了您的解决方案并完美运行。谢谢!
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2018-03-26
    • 2011-10-28
    • 2010-12-30
    • 2011-11-01
    • 2015-04-07
    相关资源
    最近更新 更多