如何将组合框的更改返回到WPF / XAML MVVM中的ObservableCollection

问题描述 投票:0回答:2

我的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收藏集绑定到...

wpf xaml data-binding combobox observablecollection
2个回答
-1
投票

您的Car类必须实现INotifyPropertyChanged接口。


-1
投票

通过实现INotifyPropertyChanged将此必要更改更改为您的Car

© www.soinside.com 2019 - 2024. All rights reserved.