2016-09-16 8 views
0

При поиске справки по этому вопросу я обычно нахожу информацию о том, как заполнить ComboBox со связанными данными (отображаемое имя в одной таблице для внешнего ключа в исходной таблице) , но я уже могу это сделать. Я ищу решение о том, как добиться такого же результата в TextBlock.WPF Как отображать реляционные данные в TextBlock DataGrid, как в ComboBox

В моем проекте я создал ссылку на базу данных SQL, используя EntityFramework. Есть две таблицы: Персонал и Роль. Они связаны с Personnel.RoleIdFk и Role.RoleId.

Related Tables

Я могу получить выпадающий для отображения Role.RoleName для соответствующего RoleIdFk.

ComboBoxes

В моей ViewModel:

private ICollection<Role> roleList; 
    public ICollection<Role> RoleList 
    { 
     get { return roleList; } 
     set { roleList = value; NotifyPropertyChanged("RoleList"); } 
    } 

    private Role selectedRole; 
    public Role SelectedRole 
    { 
     get { return selectedRole; } 
     set { selectedRole = value; NotifyPropertyChanged("SelectedRole"); } 
    } 

    public void SetSelectedRole() 
    { 
     if (SelectedPerson == null) 
     { 
      SelectedPerson = PersonnelList.Select(p => p) 
              .FirstOrDefault(); 
     } 


     SelectedRole = RoleList.Where(p => p.RoleId == SelectedPerson.RoleIdFk) 
            .FirstOrDefault(); 
    } 

И XAML для ComboBox:

 <ComboBox x:Name="cboRole" 
       Grid.Column="1" Grid.Row="0" 
       Width="150" Height="35" 
       ItemsSource="{Binding RoleList}" 
       DisplayMemberPath="RoleName" 
       SelectedItem="{Binding SelectedRole}" 
       /> 

Моя проблема заключается Я также отображение DataGrid для персонала Таблица. В этом DataGrid я хотел бы, чтобы вместо ключевого внешнего ключа отображалось связанное имя RoleName.
Текущий XAML для DataGrid:

<Window.DataContext> 
    <viewModel:MainWindowVM /> 
</Window.DataContext> 

    <ListView Name="lstPersonnel" 
       Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" 
       ItemContainerStyle="{StaticResource ItemContStyle}" 
       ItemsSource="{Binding PersonnelList}" > 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="75" Header="First Name" > 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding FirstName}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

       <GridViewColumn Width="75" Header="Last Name" > 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding LastName}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

       <GridViewColumn Width="75" Header="Role" > 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding RoleIdFk}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Это то, что сетка выглядит следующим образом:

DataGrid

Для последней колонке я попытался изменения текстового поля различными способами , Я также пробовал использовать другие шаблоны и стили. Ни один из них не был успешным.

Есть ли способ на самом деле выполнить это в самом XAML, или мне придется настроить какой-то конвертер значений для достижения этого?

ПРИМЕЧАНИЕ: Я думал о том, чтобы использовать какой-то сценарий «switch/case». Хотя он будет работать здесь, мне нужно выяснить, что может быть более динамичным. Позже в проекте мне нужно будет связать PersonnelId с другими элементами. Сценарий «switch/case» невозможен с более чем 300 людьми.

ответ

0

«Роль» должна быть доступна в объекте «Персонал». Таким образом, вы можете просто использовать «Role.RoleName» вместо «RoleIdFk»:

<TextBlock Text="{Binding Role.RoleName}" /> 

В тех случаях, когда вы не имеете, на который ссылается объект, то лучше соединить две коллекции и использовать результат в качестве ItemsSource из DataGrid. Вот пример: Joining two tables in one datagrid usig Linq C# WPF

Существует также решение с IMultiValueConverter, но мне кажется усложненной: Joining 2 collections into datagrid using multibinding

+0

OMG. Я думаю, моя проблема была в том, что я не следовал за К.И.С.С.и я старался сделать это чрезмерно сложным. Это сработало отлично. – Cedage

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