2014-12-11 4 views
0

Хорошо, вот сделка. У меня есть CollectionViewSource:WPF ComboBox Binding с конвертером

<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 из БД. Затем конвертер правильно берет значение внутри столбца «AppStatus» и пытается его преобразовать, чтобы выбрать один из элементов ComboBox и назначить SelectedValue. Однако ничего не происходит.

ответ

2

Похоже, что проблема заключается в том, что вы возвращаете строковое значение из конвертера, но ItemsSource является ArrayList, заполненным ComboBoxItems, поэтому он проверяет, является ли ссылка одинаковой. Попробуйте заполнить ArrayList строковыми значениями вместо ComboBoxItems. Вы можете использовать обычный массив строк для этого:

<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" Затем вы можете упростить ваш конвертер следующим образом:

Convert:

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

ConvertBack:

{ 
    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; 
} 
+0

Только что проверили ваше решение и обработали perfe кт. Благодаря! – argledhel