我的ViewModel中有一个汽车的ObservableCollection。汽车具有两个属性,“ Make”是字符串,而Color是自定义枚举。我已经成功将我的Cars集合绑定到DataGrid,并且在DataGrid内有一个用于Make的列和一个使用ComboBox的Color列。所选值反映了我最初将Car设置为的值。用户可以从ComboBox中选择另一种颜色,但是该选择不会更新回ObservableCollection中的Car。我该怎么做?
我将代码和XAML放在下面。任何帮助/指针将不胜感激! -戴夫
MainWindow(这是一个简单的演示,包括后面代码的类,ViewModel和Car类的类):
using library.EnumDefinitions;
using System;
using System.Collections.ObjectModel;
using System.Windows;
namespace TrickyBindingProblems
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowVM();
}
private void Button_Click(object sender,RoutedEventArgs e)
{
foreach (ICar car in (DataContext as MainWindowVM).Cars)
{
Console.WriteLine(car.Color.ToString()); // NO CHANGES in Colors unfortunately!
}
}
}
public class MainWindowVM
{
public MainWindowVM()
{
Cars = new ObservableCollection<ICar>();
Cars.Add(new Car(MyColor.Green,"Honda"));
Cars.Add(new Car(MyColor.Blue,"GM"));
Cars.Add(new Car());
}
public ObservableCollection<ICar> Cars { get; set; }
}
public class Car : ICar
{
public Car()
{
Color = MyColor.Red;
Make = "Ford";
}
public Car(MyColor color,string make)
{
Color = color;
Make = make;
}
public MyColor Color { get; set; }
public string Make { get; set; }
}
public interface ICar
{
MyColor Color { get; set; }
string Make { get; set; }
}
}
我的枚举类(我将其放在另一个项目和命名空间中以反映更大的项目)
namespace library.EnumDefinitions
{
public enum MyColor
{
Red,Blue,Green
}
}
最后是XAML
<Window x:Class="TrickyBindingProblems.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TrickyBindingProblems"
xmlns:enu="clr-namespace:library.EnumDefinitions"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<ObjectDataProvider x:Key="EnumDataProvider" MethodName="Getvalues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="enu:MyColor" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" Grid.Column="1"
Margin="0"
HorizontalAlignment="Left"
AutoGenerateColumns="False"
Background="Transparent"
DataContext="{Binding}"
HeadersVisibility="Column"
ItemsSource="{Binding Cars}"
SelectedItem="{Binding SelectedItemProperty,Mode=TwoWay}"
RowBackground="Transparent"
RowHeight="30">
<DataGrid.CellStyle>
<Style TargetType="{x:Type datagridcell}">
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="FontWeight" Value="Bold" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Width="*" Header="Make">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center"
Padding="5"
Text="{Binding Make}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="*" Header="Color (as ComboBox)">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedItem="{Binding Color,Mode=TwoWay}">
<ComboBox.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Black" />
</Style>
</ComboBox.Resources>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="2" Click="Button_Click">Push Me!</Button>
</Grid>
</Window>