使用组合框对DataGridTemplateColumn进行排序

本文关键字:排序 DataGridTemplateColumn 组合 | 更新日期: 2023-09-27 18:27:08

我有一个DataGrid,只有一列(为了这个例子)。此列是DataGridTemplateColumn:

<DataGrid x:Name="grdMainGrid">
    <DataGridTemplateColumn Header="Room" CanUserSort="True" SortMemberPath="DisplayText" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding Path=AllRooms, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Height="20" SelectedValuePath="Code" SelectedValue="{Binding Path=RoomCode, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="DisplayText" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid>

DataGrid的ItemsSource设置为List:

public class InsertableRecord
{
    public int RoomCode { get; set; }
}

DataGridTemplateColumn中组合框的ItemsSource绑定到我的窗口中的属性:

public List<Room> AllRooms
{
    get;
    private set;
}

以下是"房间"类别的定义:

public partial class Room
{
    public string ID { get; set; }
    public string Description { get; set; }
    public string DisplayText
    {
        get
        {
            return this.ID + " (" + this.Description + ")";
        }
    }
}

请注意,我的SortMemberPath设置为DisplayText,这是"Room"的属性,而不是"InsertableRecord"的属性。很明显,当我试图对该列进行排序时,我遇到了一个绑定错误,称对象"InsertableRecord"中不存在属性"DisplayText"。

如何根据组合框的当前文本(或"房间"对象的DisplayText属性,两者都可以)对列进行排序?

使用组合框对DataGridTemplateColumn进行排序

好的,暂时,我创建了一个小破解:我在InsertableRecord中创建了一个名为SelectedDisplayText的新属性。

public class InsertableRecord
{
    public int RoomCode { get; set; }
    public string SelectedDisplayText { get; set; }
}

然后我将DataGrid列的定义更改为:

<DataGrid x:Name="grdMainGrid">
    <DataGridTemplateColumn Header="Room" CanUserSort="True" **SortMemberPath="SelectedDisplayText"** >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding Path=AllRooms, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Height="20" SelectedValuePath="Code" SelectedValue="{Binding Path=RoomCode, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="DisplayText" **Text="{Binding Path=SelectedDisplayText, Mode=OneWayToSource}"** />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid>

现在,每次我更改组合框的选择时,组合框的新"Selected Text"都会填充到InsertableRecord对象的"SelectedDisplayText"中,然后数据网格可以使用它根据该值进行排序。

现在这是有效的,但它仍然感觉像一个黑客。我希望有一种方法可以构建一个自定义排序,通过正在处理的行的数据上下文,我可以获得该行的相关组合框并提取其当前文本值。。。但这似乎不是一个选择。。。

任何其他提议都将受到赞赏,因为这是一种我将在整个应用程序中重复使用的模式,我希望它尽可能干净,以避免重写重复代码。。。