Привязать linq к DataGridComboBoxColumn - PullRequest
0 голосов
/ 08 марта 2011

Я использую wpftoolkit от wpf.codeplex.com. При привязке таблицы данных (через список объектов linq) существует столбец, который содержит ссылку на другое содержимое таблицы в качестве внешнего ключа. Итак, обычно в настоящее время в этом столбце таблицы данных я хочу показать поле со списком, содержащее элемент другой таблицы, а выбранный элемент должен быть из моей соответствующей таблицы. Вот что я пишу:

<dg:DataGrid x:Name="UsersGrid" AutoGenerateColumns="False" CellEditEnding="UsersGrid_CellEditEnding" RowEditEnding="UsersGrid_RowEditEnding" PreviewKeyDown="UsersGrid_PreviewKeyDown">
                <dg:DataGrid.Columns>
                    <dg:DataGridTextColumn Binding="{Binding Path=Id}" Header="Id" Visibility="Hidden" />
                    <dg:DataGridTextColumn Binding="{Binding Path=Username}" Header="User Name" />
                    <dg:DataGridTextColumn Binding="{Binding Path=Password}" Header="Password" />
                    <dg:DataGridTextColumn Binding="{Binding Path=RoleId}" Header="Role ID" />
                    <dg:DataGridComboBoxColumn x:Name="Roles" ItemsSource="{Binding Path=TVRole}">                            

                    </dg:DataGridTemplateColumn>
                </dg:DataGrid.Columns>
            </dg:DataGrid>

Для привязки код файла содержит следующий код:

UsersGrid.ItemsSource = UserManager.GetAllUsers();

Проблема в том, что теперь я не знаю, что поместить в свойство ItemsSource, чтобы добиться того, что я хочу для столбца DataGridComboBoxColumn . Кто-нибудь может мне помочь, пожалуйста! Снова упомяну, я хочу связать это с объектом linq.

1 Ответ

2 голосов
/ 08 марта 2011

Существует странная ошибка с DataGridComboBoxColumn: свойство ItemsSource не поддерживает расширенные привязки. Но вы можете использовать DataGridTemplateColumn, и код будет таким:

<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Id}" Header="Id" Visibility="Hidden" />
        <DataGridTextColumn Binding="{Binding Path=Username}" Header="User Name" />
        <DataGridTextColumn Binding="{Binding Path=Password}" Header="Password" />
        <DataGridTextColumn Binding="{Binding Path=RoleId}" Header="Role ID" />
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=DataContext.Roles, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
                              DisplayMemberPath="Title" SelectedValuePath="Id" SelectedValue="{Binding RoleId, Mode=TwoWay}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

И добавьте этот код в конструктор View:

 var model = new MainViewModel() { Users = UserManager.GetAllUsers(), Roles = UserManager.GetAllRoles() };
 this.DataContext = model;

Где MainViewModel - вспомогательный класс:

public class MainViewModel
{
    public List<Role> Roles { get; set; }
    public List<User> Users { get; set; }
}

Другой способ - использовать список UserViewModel вместо списка User, где каждый класс viewmodel содержит список ролей, поэтому можно будет использовать правильную привязку. Но это более сложное решение, чем упомянутое выше.

...