我的ViewModel中有一个ObservableCollections汽车。汽车具有两个属性,“ 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>
我的ViewModel中有一个ObservableCollections汽车。汽车具有两个属性,“ Make”是字符串,而Color是自定义枚举。我已成功将我的Cars收藏集绑定到...
您的Car
类必须实现INotifyPropertyChanged
接口。
通过实现INotifyPropertyChanged将此必要更改更改为您的Car