Связывающий Combobox внутри DataGrid - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть DataGrid с 3 столбцами внутри: Name -DataGridTextColumn, Value-DataGridTextColumn, Param Json - DataGridTemplateColumn с выпадающим списком и имеет ICollectionView of ParameterGrid в качестве источника.

Существует ViewModel, который обеспечивает ICollectionView ParameterGrid. ParameterGrid содержит 4 параметра: имя, значение, параметр Json, SelectedParam Json.

Мне нужно обработать все строки DataGrid, поэтому я использую команду, которая получает все dataGrid в качестве параметра команды, а затем повторяется. через DataGrid.Items (я мог бы использовать непосредственно ICollectionView?).

Вопрос в том, как правильно привязать SelectedItem в Combobox в DataGrid к SelectedParam Json?

Xaml:

<DataGrid Grid.Row="0"
                x:Name="parametersGridView"
                AutoGenerateColumns="False"
                VerticalScrollBarVisibility="Visible"
                CanUserAddRows="False"
                ItemsSource="{Binding PropertiesGrid}"
                Margin="5"
                AlternatingRowBackground="LightGoldenrodYellow">

         <DataGrid.Columns>
            <DataGridTextColumn Header="Name"
                                Binding="{Binding Path=Name}"
                                IsReadOnly="True" />

            <DataGridTextColumn Header="Value"
                                Binding="{Binding Path=Value}" />

            <DataGridTemplateColumn Header="Parameter" >
               <DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                     <ComboBox MinWidth="100"
                               MaxWidth="150"
                               ItemsSource="{Binding Path=ParamsJson}"
                               SelectedItem="{Binding Path=SelectedParamJson, RelativeSource={RelativeSource AncestorType=DataGrid}}"
                               StaysOpenOnEdit="True"
                               IsEditable="True">
                        <ComboBox.ItemTemplate>
                           <DataTemplate>
                              <TextBlock Text="{Binding}" />
                           </DataTemplate>
                        </ComboBox.ItemTemplate>
                     </ComboBox>
                  </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

         </DataGrid.Columns>
      </DataGrid >     <DataGrid Grid.Row="0"
                x:Name="parametersGridView"
                AutoGenerateColumns="False"
                VerticalScrollBarVisibility="Visible"
                CanUserAddRows="False"
                ItemsSource="{Binding PropertiesGrid}"
                Margin="5"
                AlternatingRowBackground="LightGoldenrodYellow">

         <DataGrid.Columns>
            <DataGridTextColumn Header="Name"
                                Binding="{Binding Path=Name}"
                                IsReadOnly="True" />

            <DataGridTextColumn Header="Value"
                                Binding="{Binding Path=Value}" />

            <DataGridTemplateColumn Header="Parameter" >
               <DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                     <ComboBox ItemsSource="{Binding Path=ParamsJson}"
                               SelectedItem="{Binding Path=SelectedParamJson, RelativeSource={RelativeSource AncestorType=DataGrid}}"
                               StaysOpenOnEdit="True"
                               IsEditable="True">
                        <ComboBox.ItemTemplate>
                           <DataTemplate>
                              <TextBlock Text="{Binding}" />
                           </DataTemplate>
                        </ComboBox.ItemTemplate>
                     </ComboBox>
                  </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

         </DataGrid.Columns>
      </DataGrid >`

ViewModel

class DataGridViewModel : DependencyObject
{
    public DataGridViewModel()
    {
        var data = new DataEmulator();
        PropertiesGrid = CollectionViewSource.GetDefaultView(data.GetCommonParameters());
    }

    public ICollectionView PropertiesGrid
    {
        get { return (ICollectionView)GetValue(PropertiesGridProperty); }
        set { SetValue(PropertiesGridProperty, value); }
    }
    public static readonly DependencyProperty PropertiesGridProperty =
        DependencyProperty.Register("PropertiesGrid", typeof(ICollectionView), typeof(DataGridViewModel), new PropertyMetadata(null));

    public ICommand TestCommand
    {
        get
        {
            return new RelayCommand
            {
                ExecuteAction = a =>
                {

                    // here SelectedParamJson should be as Selected in combobox,
                    // but it is always null because of the wrong binding
                },
                CanExecutePredicate = p =>
                {
                    return true;
                }
            };
        }
    }
}
public class ParameterGrid
{
    public string Name { get; set; }
    public string Value { get; set; }
    public List<SamResult> ParamsJson { get; set; }
    public SamResult SelectedParamJson { get; set; }
}

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Если вы хотите связать со свойством SelectedParamJson, которое определено в том же классе, что и свойство ParamsJson, вам не следует устанавливать для свойства RelativeSource что-либо вообще:

ItemsSource="{Binding Path=ParamsJson}"
SelectedItem="{Binding Path=SelectedParamJson}"

Вы также должны переместить ComboBox в CellEditingTemplate из DataGridTemplateColumn.

1 голос
/ 08 апреля 2020

Дело в том, что вы должны определить <DataGridTemplateColumn.CellEditingTemplate>, где вы должны делать все привязки, и <DataGridTemplateColumn.CellTemplate>, это текущее значение, когда ячейка не активна.

Кажется странным, что вы не можете связать все внутри <DataGridTemplateColumn.CellTemplate>, потому что вам нужно сделать дополнительный щелчок, чтобы активировать комбинированный список.

Xaml, который работает для меня:

    <DataGridTemplateColumn Header="Parameter" >

       <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
             <TextBlock Text="{Binding Path=SelectedParamJson}" />
          </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>

       <DataGridTemplateColumn.CellEditingTemplate>
          <DataTemplate>
             <ComboBox MinWidth="100"
                       MaxWidth="150"
                       ItemsSource="{Binding Path=ParamsJson}"
                       SelectedItem="{Binding Path=SelectedParamJson}"
                       StaysOpenOnEdit="True"
                       IsEditable="True">
                <ComboBox.ItemTemplate>
                   <DataTemplate>
                      <TextBlock Text="{Binding}" />
                   </DataTemplate>
                </ComboBox.ItemTemplate>
             </ComboBox>
          </DataTemplate>
       </DataGridTemplateColumn.CellEditingTemplate>

    </DataGridTemplateColumn>
0 голосов
/ 08 апреля 2020

ваш предок - это не сетка данных, а дата, из которой вы хотите получить текст данных.

, поэтому вы создали представление коллекции некоторой исходной коллекции, такой как список, это означает, что каждая строка в вашей базе данных представляет объект IJsonObject и там у вас должна быть определена ваша коллекция для столбца ComboBox. Как и список, который вы можете привязать к столбцу, а в свою очередь вы можете иметь поле IJsonProperty, которое вы можете привязать к выбранному элементу.

Итак, вы должны получить комбинированный список, заполненный вашими элементами списка, и если вы выберете один из них, поле IJsonProerty будет установлено на выбранный элемент.

Надеюсь, это понятно, потому что у меня сейчас нет фрагмента кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...