使用来自另一列的值填充 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 的 DataContext
。 ItemsSource
不应通过代码隐藏完成(这是 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
和标准 Combobox
。 ComboBox
然后将绑定到对象集合,显示名称,但在 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>
我是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 的 DataContext
。 ItemsSource
不应通过代码隐藏完成(这是 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
和标准 Combobox
。 ComboBox
然后将绑定到对象集合,显示名称,但在 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>