При поиске справки по этому вопросу я обычно нахожу информацию о том, как заполнить ComboBox со связанными данными (отображаемое имя в одной таблице для внешнего ключа в исходной таблице) , но я уже могу это сделать. Я ищу решение о том, как добиться такого же результата в TextBlock.WPF Как отображать реляционные данные в TextBlock DataGrid, как в ComboBox
В моем проекте я создал ссылку на базу данных SQL, используя EntityFramework. Есть две таблицы: Персонал и Роль. Они связаны с Personnel.RoleIdFk и Role.RoleId.
Я могу получить выпадающий для отображения Role.RoleName для соответствующего RoleIdFk.
В моей 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>
Это то, что сетка выглядит следующим образом:
Для последней колонке я попытался изменения текстового поля различными способами , Я также пробовал использовать другие шаблоны и стили. Ни один из них не был успешным.
Есть ли способ на самом деле выполнить это в самом XAML, или мне придется настроить какой-то конвертер значений для достижения этого?
ПРИМЕЧАНИЕ: Я думал о том, чтобы использовать какой-то сценарий «switch/case». Хотя он будет работать здесь, мне нужно выяснить, что может быть более динамичным. Позже в проекте мне нужно будет связать PersonnelId с другими элементами. Сценарий «switch/case» невозможен с более чем 300 людьми.
OMG. Я думаю, моя проблема была в том, что я не следовал за К.И.С.С.и я старался сделать это чрезмерно сложным. Это сработало отлично. – Cedage