Я реализую привязку 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;
}
}
}
Это прекрасно работает, я вижу комбинированную коробку со всеми цветами:
Теперь я добавил несколько объектов в 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}">
Есть идеи?
Спасибо!
Является ли свойство 'Color' обжигом события изменения свойства, когда оно установлено? – Xavier
Да, я реализовал интерфейс для INotifyPropertyChange – Derorrist