繁体   English   中英

如何从特定行的ComboboxColumn中选择内容?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM