[英]How to get selection from ComboboxColumn in specific row?
我不知道如何在选择后从ComboboxColumn单元格正确返回值。 我的ComboboxColum看起来像这样:
<DataGridComboBoxColumn CanUserSort="False"
x:Name="cbcList"
DisplayMemberPath="{Binding Person, Converter={StaticResource converter}}"
Header="Person"/>
ItemsSource
在后面的代码中设置为Person
对象的列表。 现在,我如何才能从此列中的所有选择中获取Person
对象的列表? 我试图制作一个新的Person
对象列表,并使用SelectedItemBinding
绑定它,但这是错误的方法,或者我犯了一些错误。
SelectedItem没有属性设置器,这意味着您无法为其分配绑定。 但是,我们可以通过SelectionChanged事件跟踪多个选择。
假设:在ViewModel中有一个名为People的ObservableCollection。
在ViewModel中创建一个名为SelectedPeople的Collection属性
Public Collection<Person> SelectedPeople { get; set; }
在XAML中实现SelectionChanged事件。
<DataGrid ItemsSource="{Binding Path=People}" SelectionChanged="Selector_OnSelectionChanged" />
后面代码中的SelectionChanged处理程序将如下所示。
private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems != null)
{
e.AddedItems.OfType<Person>()
.ToList()
.ForEach(ViewModel.SelectedPeople.Add);
}
if (e.RemovedItems != null)
{
e.RemovedItems.OfType<Person>()
.ToList()
.ForEach(p => ViewModel.SelectedPeople.Remove(p));
}
}
为了简洁起见,我删除了异常管理。
编辑 -上面是关于处理DataGrid中的多个选择的。 我已将上面的PersonModel重命名为Person。 它是将数据公开给视图的模型。 ViewModel是一个类,用于管理模型和用于操纵模型的功能。 有关更多信息,请参见google MVVM模式 。
关于您的原始问题,处理了DataGridComboBoxColumn和DataGrid之间的绑定,我创建了一个示例。 可以将以下代码复制到新项目中。
人员模型是
public class Person
{
public string FirstName { get; set; }
public string Surname { get; set; }
public string MiddleName { get; set; }
public int Age { get; set; }
}
而且ViewModel是
public class MyViewModel
{
public MyViewModel()
{
this.People = new ObservableCollection<Person>()
{
new Person() { FirstName = "A", Surname = "B", MiddleName = "C", Age = 1},
new Person() { FirstName = "D", Surname = "E", MiddleName = "F", Age = 2},
new Person() { FirstName = "G", Surname = "H", MiddleName = "I", Age = 3},
new Person() { FirstName = "J", Surname = "K", MiddleName = "L", Age = 4},
new Person() { FirstName = "M", Surname = "N", MiddleName = "O", Age = 5}
};
this.Items = new ObservableCollection<GridItem>()
{
new GridItem() { Person = this.People[0]},
new GridItem() { Person = this.People[1]},
new GridItem() { Person = this.People[2]},
new GridItem() { Person = this.People[3]}
};
}
public ObservableCollection<Person> People { get; set; }
public ObservableCollection<GridItem> Items { get; set; }
}
视图背后的代码只是创建并公开ViewModel。
public partial class MainWindow : Window
{
public MainWindow()
{
ViewModel = new MyViewModel();
InitializeComponent();
}
public MyViewModel ViewModel { get; set; }
}
将所有乐趣留在Xaml中。
<Window x:Class="StackOverflow._20902950.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:this="clr-namespace:StackOverflow._20902950"
DataContext="{Binding RelativeSource={RelativeSource Self}, Path=ViewModel}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Person" Width="100" DisplayMemberPath="FirstName" SelectedItemBinding="{Binding Path=Person}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type this:MainWindow}}, Path=ViewModel.People}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type this:MainWindow}}, Path=ViewModel.People}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
此名称空间将需要更改为项目的名称空间。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.