Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 按组合框显示值对DataGrid排序_Wpf_Sorting_Datagrid_Combobox - Fatal编程技术网

Wpf 按组合框显示值对DataGrid排序

Wpf 按组合框显示值对DataGrid排序,wpf,sorting,datagrid,combobox,Wpf,Sorting,Datagrid,Combobox,我有两个具有父子关系的数据网格,它们都绑定到数据集合。子DataGrid实现DataGridComboxColumn,用于显示父项的名称而不是id 问题:如何按此列对第二个数据网格进行排序,但不按Id,而是按父级的名称进行排序? XAML: <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x

我有两个具有父子关系的数据网格,它们都绑定到数据集合。子DataGrid实现DataGridComboxColumn,用于显示父项的名称而不是id

问题
如何按此列对第二个数据网格进行排序,但不按Id,而是按父级的名称进行排序?

XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    x:Name="MainWnd"
    Title="MainWindow" Height="500" Width="650" Loaded="MainWindow_OnLoaded">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>

    <GridSplitter Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Height="5"/>

    <local:BaseGrid Grid.Row="0" Margin="3" AutoGenerateColumns="False"
                    ItemsSource="{Binding ElementName=MainWnd, Path=AColView.View}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Path=Id}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Aname}"/>
        </DataGrid.Columns>
    </local:BaseGrid>

    <local:BaseGrid Grid.Row="2" Margin="3" AutoGenerateColumns="False"
                    ItemsSource="{Binding ElementName=MainWnd, Path=BColView.View}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Id}">
                <DataGridTextColumn.Header>
                    <local:CaptionExtender Caption="Id"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Bname}">
                <DataGridTextColumn.Header>
                    <local:CaptionExtender Caption="Name"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridComboBoxColumn x:Name="BparentColumn"
                                    SelectedValueBinding="{Binding ParentId}"
                                    SelectedValuePath="Id"
                                    DisplayMemberPath="Aname">
                <DataGridComboBoxColumn.Header>
                    <local:CaptionExtender Caption="Parent"/>
                </DataGridComboBoxColumn.Header>
            </DataGridComboBoxColumn>

        </DataGrid.Columns>
    </local:BaseGrid>
</Grid>
</Window>
public partial class MainWindow
{
    private ObservableCollection<A> ACol { get; set; }
    private ObservableCollection<B> BCol { get; set; }

    public CollectionViewSource AColView { get; private set; }
    public CollectionViewSource BColView { get; private set; }

    public MainWindow()
    {
        ACol = new ObservableCollection<A>();
        BCol = new ObservableCollection<B>();

        AColView = new CollectionViewSource { Source = ACol };
        BColView = new CollectionViewSource { Source = BCol };

        InitializeComponent();

        BparentColumn.ItemsSource = ACol;

    }

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        // add parents
        for (int i = 1; i <= 5; ++i)
            ACol.Add(new A { Id = i, Aname = "Parent " + i.ToString(CultureInfo.InvariantCulture) });

        // add children
        for (int i = 1; i <= 1000; ++i)
            BCol.Add(new B { Id = i, Bname = "Child " + i.ToString(CultureInfo.InvariantCulture), ParentId = (i % ACol.Count) + 1 });
    }
}

public class A
{
    public int Id { get; set; }
    public string Aname { get; set; }
}

public class B
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Bname { get; set; }
}

代码隐藏:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    x:Name="MainWnd"
    Title="MainWindow" Height="500" Width="650" Loaded="MainWindow_OnLoaded">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>

    <GridSplitter Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Height="5"/>

    <local:BaseGrid Grid.Row="0" Margin="3" AutoGenerateColumns="False"
                    ItemsSource="{Binding ElementName=MainWnd, Path=AColView.View}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Path=Id}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Aname}"/>
        </DataGrid.Columns>
    </local:BaseGrid>

    <local:BaseGrid Grid.Row="2" Margin="3" AutoGenerateColumns="False"
                    ItemsSource="{Binding ElementName=MainWnd, Path=BColView.View}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Id}">
                <DataGridTextColumn.Header>
                    <local:CaptionExtender Caption="Id"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Bname}">
                <DataGridTextColumn.Header>
                    <local:CaptionExtender Caption="Name"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridComboBoxColumn x:Name="BparentColumn"
                                    SelectedValueBinding="{Binding ParentId}"
                                    SelectedValuePath="Id"
                                    DisplayMemberPath="Aname">
                <DataGridComboBoxColumn.Header>
                    <local:CaptionExtender Caption="Parent"/>
                </DataGridComboBoxColumn.Header>
            </DataGridComboBoxColumn>

        </DataGrid.Columns>
    </local:BaseGrid>
</Grid>
</Window>
public partial class MainWindow
{
    private ObservableCollection<A> ACol { get; set; }
    private ObservableCollection<B> BCol { get; set; }

    public CollectionViewSource AColView { get; private set; }
    public CollectionViewSource BColView { get; private set; }

    public MainWindow()
    {
        ACol = new ObservableCollection<A>();
        BCol = new ObservableCollection<B>();

        AColView = new CollectionViewSource { Source = ACol };
        BColView = new CollectionViewSource { Source = BCol };

        InitializeComponent();

        BparentColumn.ItemsSource = ACol;

    }

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        // add parents
        for (int i = 1; i <= 5; ++i)
            ACol.Add(new A { Id = i, Aname = "Parent " + i.ToString(CultureInfo.InvariantCulture) });

        // add children
        for (int i = 1; i <= 1000; ++i)
            BCol.Add(new B { Id = i, Bname = "Child " + i.ToString(CultureInfo.InvariantCulture), ParentId = (i % ACol.Count) + 1 });
    }
}

public class A
{
    public int Id { get; set; }
    public string Aname { get; set; }
}

public class B
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Bname { get; set; }
}
公共部分类主窗口
{
私人收藏

这就是我想要实现的目标:

只需添加CanUserSortColumns=“True”不重要,仍然按id(selectedvalue)排序,而不是按名称(DisplayValue)不清楚“如何按此列对第二个数据网格进行排序,而是按父级的名称,而不是按id?”你想根据父网格排序对第二个网格进行排序吗?@makc,不,他们的排序是独立的。另外,我已经在问题的第二个链接中发布了所需结果的图像