使用来自另一列的值填充 DataGrid 的 ComboBox

Populate ComboBox of a DataGrid with values from another column

我是Winforms的资深用户,现在正在玩WPF,但有点吃力。 我有一个包含 2 列的数据网格。 第一列是绑定到我的对象的 "Name" 属性 的 DataGridTextColumn。 第二列绑定到我对象的"Power"属性

当用户编辑 Power 列时,我想显示一个组合框,其中列出了第一列的所有名称以及 "None" 作为第一项。 我该怎么做?

此外,如果用户更新第一列的任何名称,我希望更改反映在电源列中。可能吗?

在后面的代码中:

public partial class MainWindow : Window
{
    ObservableCollection<MyObject> objects = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        InitializeComponent();
        dgObjects.ItemsSource = objects;
    }
}

public class MyObject
{   
    public String Name { get; set; }
    public String Power { get; set; }
}

在Xaml中:

<DataGrid Name="dgObjects" AutoGenerateColumns="False">
   <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridComboBoxColumn Header="Power" Binding="????"/>
    </DataGrid.Columns>
</DataGrid>

谢谢

您可以通过绑定 DataContext 来完成此操作。不过,首先您需要正确设置 Window 的 DataContextItemsSource 不应通过代码隐藏完成(这是 WPF,使用绑定!)。

设置您的 class 结构,例如:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }

    public class ViewModel
    {
        public ObservableCollection<MyObject> Objects { get; } = new ObservableCollection<MyObject>();

        public ViewModel()
        {
            Objects.Add(new MyObject
            {
                Name = "Name"
            });
            Objects.Add(new MyObject
            {
                Name = "Name2"
            });
            Objects.Add(new MyObject
            {
                Name = "Name3"
            });
        }
    }

    public class MyObject
    {
        public String Name { get; set; }
        public String Power { get; set; }
    }

现在,更新您的 xaml。您将需要使用 CellTemplate 和标准 ComboboxComboBox 然后将绑定到对象集合,显示名称,但在 Power 中设置值。

<Window x:Class="WpfApplication8.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"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        x:Name="MyWindow">
    <Grid>
        <DataGrid Name="dgObjects" AutoGenerateColumns="False"
                  ItemsSource="{Binding Objects}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding ElementName=MyWindow, Path=DataContext.Objects}" 
                                      DisplayMemberPath="Name"
                                      SelectedItem="{Binding Power}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>