2013-08-09 5 views
0

У меня есть DataGrid с одним столбцом (для этого примера). Этот столбец является DataGridTemplateColumn:Сортировка DataGridTemplateColumn с ComboBox

<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> 

ItemsSource В DataGrid имеет значение в списке:

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

ItemsSource В ComboBox находится в DataGridTemplateColumn связан со свойством моего окна:

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, который является свойством «Комната», а не «InsertableRecord». Поэтому, очевидно, я получаю ошибку привязки, когда пытаюсь сортировать этот столбец, говоря, что свойство «DisplayText» не существует в объекте «InsertableRecord».

Как бы я мог сортировать столбец на основе текущего текста ComboBox (или свойства DisplayText объекта «Комната», оба будут работать)?

ответ

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> 

И теперь с этим, каждый раз, когда я изменить выбор моего Наримера, новый «Selected Text» из выпадающего списка получает населенный в «SelectedDisplayText» объекта InsertableRecord, и datagrid затем может использовать его для сортировки в соответствии с этим значением.

Теперь это работает, но оно все еще похоже на взлома. Я хотел бы исключить, что может существовать способ создания пользовательского Сорта, который каким-то образом через контекст данных обрабатываемой строки мог бы получить связанный ComboBox этой строки и извлечь его текущее текстовое значение ... Но это doesn Кажется, что это вариант ...

Любое другое предложение было бы оценено, так как это образец, который я буду повторно использовать в моем приложении, и мне хотелось бы сделать его настолько чистым, насколько это возможно, чтобы избежать необходимо переписать повторный код ...

Смежные вопросы