使用组合框对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属性,两者都可以)对列进行排序?
好的,暂时,我创建了一个小破解:我在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"中,然后数据网格可以使用它根据该值进行排序。
现在这是有效的,但它仍然感觉像一个黑客。我希望有一种方法可以构建一个自定义排序,通过正在处理的行的数据上下文,我可以获得该行的相关组合框并提取其当前文本值。。。但这似乎不是一个选择。。。
任何其他提议都将受到赞赏,因为这是一种我将在整个应用程序中重复使用的模式,我希望它尽可能干净,以避免重写重复代码。。。