Как получить свойство SelectedItem из столбца ComboBox в wpf DataGrid - PullRequest
0 голосов
/ 15 февраля 2019

недавно мы начали использовать WPF на работе.Теперь я хочу создать DataGrid из списка объектов (DataGrid ItemSource), который содержит роль проекта, сотрудника, который должен выполнять эту работу, и списка сотрудников, которые также могут выполнять эту работу.Давайте назовем этот список «MainList».В этом DataGrid есть столбец ComboBox, который использует другой список объектов в качестве ItemSource, где вы можете изменить сотрудника для работы.Я назову этот список "ChildList".Этот список включен в MainList (как уже упоминалось), и я связываю его, используя правильный BindingPath.Все идет нормально.Теперь я должен установить SelectedItem (чтобы показать, какой сотрудник выбран в данный момент).Из MainList я могу получить сотрудника, которого следует выбрать из ChildList.Очевидно, я не могу сделать это с помощью Binding.К сожалению, я не могу получить свойство SelectedItem в коде позади.По сути, мне нужно пройти через каждую строку в DataGrid и получить элемент, который должен быть выбран в ComboBox.Затем я бы проходил через элементы ComboBox, пока не нашел соответствующий элемент и не установил его как SelectedItem.Но я не могу найти способ сделать это.

Я также пытался использовать DataGridComboBoxColumn, но он имеет только свойство SelectedItemBinding, и, поскольку вы не можете сравнивать при связывании, это не должно работать.Я также пытался получить каждую ячейку в коде, то есть ComboBox, но пока безуспешно.

<DataGrid x:Name="DgvProjectTeam" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="False" Margin="0" RowHeight="40" CanUserAddRows="False" BorderThickness="1" VerticalScrollBarVisibility="Auto" HorizontalGridLinesBrush="#FFA2B5CD" VerticalGridLinesBrush="#FFA2B5CD" ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="False">
  <DataGrid.Columns>
      <DataGridTemplateColumn Header="Resource" Width="200" x:Name="DgtProjectCoreTeam">
           <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                      <ComboBox Name="CbxResource" ItemsSource="{Binding Path=ListOfPossibleResources}" DisplayMemberPath="ResourceOfQMatrix.Fullname"/>
                 </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

DataGrid показывает все, что мне нужно.Я просто не знаю, как я могу установить SelectedItem для каждого из сгенерированных ComboBoxCells в коде позади.

Кто-нибудь идея?

1 Ответ

0 голосов
/ 15 февраля 2019

Вот краткий пример того, что вы можете сделать.Сначала определите модели представлений, которые будут привязаны к DataGrid.В идеале эти модели представлений должны вызывать PropertyChanged или CollectionChanged при изменении их свойств, но для этого простого примера это не требуется.

public class ViewModel
{
    public List<ProjectRoleViewModel> ProjectRoles { get; set; }
}

public class ProjectRoleViewModel
{
    public string Role { get; set; }
    public string Employee { get; set; }
    public List<string> OtherEmployees { get; set; }
    public string SelectedOtherEmployee { get; set; }
}

Я жестко запрограммировал некоторые фиктивные значения, чтобы иметьданные в моделях представления:

var viewModel = new ViewModel
{
    ProjectRoles = new List<ProjectRoleViewModel>
    {
        new ProjectRoleViewModel
        {
            Role = "Designer",
            Employee = "John Smith",
            OtherEmployees = new List<string> {"Monica Thompson", "Robert Gavin"}
        },
        new ProjectRoleViewModel
        {
            Role = "Developer",
            Employee = "Tom Barr",
            OtherEmployees = new List<string> {"Jason Ross", "James Moore"}
        }
    }
};

Затем эту модель представления необходимо назначить для DataContext вашего Window или UserControl, который содержит DataGrid.Вот XAML для DataGrid:

<DataGrid
    ItemsSource="{Binding ProjectRoles}"
    AutoGenerateColumns="False"
    >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Role}" />
        <DataGridTextColumn Binding="{Binding Employee}" />
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox
                        ItemsSource="{Binding OtherEmployees}"
                        SelectedItem="{Binding SelectedOtherEmployee, UpdateSourceTrigger=PropertyChanged}"
                        />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

После того, как пользователь выберет «другого» сотрудника, который может выполнять работу, модель вида 101 * будет иметь выбранное значение.В этом случае вам не понадобится какой-либо программный код, все содержится в моделях представления.

...