我有一个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中的ComboBox的ItemsSource绑定到我的Window中的属性:
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”时出现绑定错误。
我如何根据ComboBox的当前Text(或“Room”对象的DisplayText属性)对列进行排序,这两种方法都有效??
答案 0 :(得分:0)
好的,暂时,我创造了一个小黑客: 我在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>
现在有了这个,每次我改变组合框的选择时,组合框的新“选定文本”会填充在InsertableRecord对象的“SelectedDisplayText”中,然后数据网格可以根据它进行排序。那个价值。
现在这个有效,但它仍然感觉像是一个黑客。我想除了可以有一种方法来构建一个自定义排序,通过正在处理的行的数据上下文,我可以获得该行的相关ComboBox并提取其当前文本值...但这不是似乎是一个选择...
任何其他命题都会受到赞赏,因为这是我将在整个应用程序中重复使用的模式,我希望尽可能保持干净以避免重写重复代码......