2015-05-27 1 views
2

Я реализую привязку ObservableCollection < ->DataGrid. Мой класс состоит из поля System.Windows.Media.Color (с именем «Цвет») и нескольких строк.ComboBox связывание работает только одним способом с цветовым свойством

Моя реализация в WPF колонки Цвет:

<DataGridTemplateColumn Header="Color" Width="100"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Source={StaticResource ColorProperties}}" 
         SelectedItem="{Binding Path=Color, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
         Style="{StaticResource ComboBoxFlatStyle}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="1" Orientation="Horizontal"> 
          <Rectangle Fill="{Binding}" Height="10" Width="10" Margin="2"/> 
          <TextBlock Text="{Binding}" Margin="2,0,0,0"/> 
         </StackPanel> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

И ColorProperties:

<ObjectDataProvider x:Key="ColorProperties" ObjectType="{x:Type color:ColorHelper}" 
        MethodName="GetColorNames"/> 

Класс ColorHelper (я постараюсь найти ОП для кредита):

public static class ColorHelper 
{ 
    public static IEnumerable<string> GetColorNames() 
    { 
     foreach (PropertyInfo p 
      in typeof(Colors).GetProperties(
      BindingFlags.Public | BindingFlags.Static)) 
     { 
      yield return p.Name; 
     } 
    } 
} 

Это прекрасно работает, я вижу комбинированную коробку со всеми цветами:

enter image description here

Теперь я добавил несколько объектов в ObservableCollection, и их соответствующие поля заполняются в DataGrid. Все, кроме цвета.

Цвет по умолчанию Черный, но когда я запускаю приложение, ComboBox остается пустым.

Когда я выбираю цвет из ComboBox, ObservableCollection соответственно изменяется. Однако, если я сам изменю объект, ComboBox останется с его первоначальным значением.

Для устранения неполадок, я добавил

<DataGridTextColumn Header="Color" Binding="{Binding Color, UpdateSourceTrigger=LostFocus}" 
        Width="100"/> 

Эта колонка получает заполняется строковым представлением цвета, а при изменении значения с обеих сторон, она изменяется соответствующим образом. Этот факт говорит о том, что в реализации ComboBox что-то отсутствует.

Я пропустил какой-либо способ перевода? Кажется странным, поскольку он фактически работает одним способом (от ComboBox до объекта).

Я искал всюду для решения, без успеха.

EDIT: Я реализовал Color < -> конвертер Строка, до сих пор не работает ..

public class StringToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Color content = (Color)value; 

     return content.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string content = (string)value; 

     return (Color)ColorConverter.ConvertFromString(content); 
    } 
} 

WPF изменение:

<ComboBox ItemsSource="{Binding Source={StaticResource ColorProperties}}" 
               SelectedItem="{Binding Path=Color, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
                  Converter={StaticResource StringToColorConverter}}" 
               Style="{StaticResource ComboBoxFlatStyle}"> 

Есть идеи?

Спасибо!

+0

Является ли свойство 'Color' обжигом события изменения свойства, когда оно установлено? – Xavier

+0

Да, я реализовал интерфейс для INotifyPropertyChange – Derorrist

ответ

0

OK Я узнал, что случилось. Похоже, что получить фактическое имя от цвета не так просто. ToString возвращает шестую строку, а не фактическое имя цвета. Итак, я использовал ответ от http://www.blogs.intuidev.com/post/2010/02/05/ColorHelper.aspx, чтобы создать конвертер.

public class ColorToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Color KnownColor; 

     Color content = (Color)value; 

     Type ColorType = typeof(System.Windows.Media.Colors); 
     PropertyInfo[] ColorsCollection = ColorType.GetProperties(BindingFlags.Public | BindingFlags.Static); 

     foreach (PropertyInfo pi in ColorsCollection) 
     { 
      KnownColor = (Color)pi.GetValue(null); 
      if (KnownColor == content) 
       return pi.Name; 
     } 

     return String.Empty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string content = (string)value; 

     return (Color)ColorConverter.ConvertFromString(content); 
    } 
} 
1

Список, связанный с Combobox, представляет собой список строк, тогда как фактический объект - это не просто строка. вам нужен конвертер, который преобразует строку в нужный объект.

Rest все кажется нормально, система знает, как доцент делает строка Черный переводится Цвет Черный

- один путь переплетные работы, так как, цвет объект знает, как получить цвет из строки, поэтому, когда мы устанавливаем фон = "String" он получает соответствующий объект, используя FromName

+0

Привет, грязь, спасибо за ответ. Извините, но я немного смущен ... В поле со списком записаны строки, поэтому выполняется преобразование Sting-> Color, так как при выборе цвета в combobox изменяется свойство Color. Отсутствует преобразование Color-> String, поскольку изменения в свойстве не отображаются в поле со списком. Я прав? Я отредактирую сообщение с преобразованным мной конвертером. Все еще не работает, хотя .. – Derorrist

+0

да, покажи мне конвертер. Я постараюсь и на моем конце – Muds

Смежные вопросы