我正在实施ObservableCollection
< - > DataGrid
绑定。
我的课程由System.Windows.Media.Color
字段(名为' Color')和几个字符串组成。
我在Color列的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课程(我试图找到OP作为学分):
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到对象)。
我到处寻找解决方案,但没有成功。
编辑: 我实现了Color&lt; - &gt; String转换器,仍然没有工作..
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 :(得分:1)
绑定到Combobox的列表是一个字符串列表,而实际的对象不仅仅是一个字符串。你需要一个从字符串转换为你想要的对象的转换器。
休息一切似乎很好,系统剂量知道字符串Black如何转换为Color Black
- 单向绑定有效,因为颜色对象知道如何从字符串中获取颜色,这就是为什么当我们设置Background =&#34; String&#34;它使用FromName
获取相应的对象答案 1 :(得分:0)
好的,我发现了什么问题。看起来从颜色中获取实际名称并不那么简单。 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);
}
}