WPF 组合框绑定与转换器

本文关键字:转换器 绑定 组合 WPF | 更新日期: 2023-09-27 18:33:58

好的,这是交易。我有一个集合视图源:

<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 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,但在引擎盖下存储字段中的字符。为此,我写了这个转换器:

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

转换回来部分工作完美,每当我选择一个值时,DataRow 都会填充其中一个字符(A,D 或 G)。

但是,转换不会。例如,我从数据库加载数据行。然后,转换器正确获取"AppStatus"列中的值,并尝试将其转换为选择组合框项之一并分配"选定值"。但是,什么也没发生。

WPF 组合框绑定与转换器

似乎问题在于您从转换器返回一个字符串值,但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;
}