Как правильно получить событие SelectionChanged из ComboBox в DataGrid? - PullRequest
1 голос
/ 22 января 2020

У меня есть модель

public class UCClipProcessingModel : BaseModel
{
    public ObservableCollection<ClipProcessingGridItem> GridItems { get; }
            = new ObservableCollection<ClipProcessingGridItem>();
}

, и есть элементы

public class ClipProcessingGridItem: IValidable
{
    public MCClipFolder ClipFolder { get; set; }

    public MCGeoCalibFolder SelectedGeoCalibrationFolder { get; set; } = MCGeoCalibFolder.EMPTY();

    public ObservableCollection<MCGeoCalibFolder> GeoCalibrationFolders { get; set; }
            = new ObservableCollection<MCGeoCalibFolder>();

    public MCColorCalibFolder SelectedColorCalibrationFolder { get; set; } = MCColorCalibFolder.EMPTY();

    public ObservableCollection<MCColorCalibFolder> ColorCalibrationFolders { get; set; }
            = new ObservableCollection<MCColorCalibFolder>();

    public bool IsValid()
    {
        return true;
    }
}

Итак, в моем .xalm в качестве контекста я использую UCClipProcessingModel и для моего DataGrid Я использую GridItems каждый элемент этого ObservableCollection фактически это одна строка в моем DataGrid.

Теперь у меня в ряду такой DataGridTemplateColumn

...
<DataGridTemplateColumn Header="Geometry calibration folder">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <ComboBox x:Name="Cb_geometry_calibration"
                SelectionChanged="Cb_geometry_calibration_SelectionChanged"
                ItemsSource="{Binding Path=GeoCalibrationFolders}"
                SelectedItem="{Binding Path=SelectedGeoCalibrationFolder}">
        <ComboBox.ItemTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding Path=UIRepresentation}" />
          </DataTemplate>
        </ComboBox.ItemTemplate>
      </ComboBox>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...

Есть скриншот

enter image description here

Теперь мне нужно знать значение, когда пользователь изменил его в ComboBox, что я могу сделать, чтобы получить его? Я установил SelectionChanged method

private void Cb_geometry_calibration_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (((sender as ComboBox).SelectedItem) is MCGeoCalibFolder itemm)
    {
        Console.WriteLine($"Item clicked: {itemm.ToString()}");
    }
}

И все хорошо, я могу получить значение, которое было изменено, но проблема в том, что я не знаю, с каким ClipProcessingGridItem из ObservableCollection это значение связано .. .

Вопрос - Как узнать, с каким элементом связано измененное значение?

1 Ответ

2 голосов
/ 22 января 2020

Вы можете привести DataContext к любому типу элемента данных:

var comboBox = sender as ComboBox;
var item = comboBox.DataContext as ClipProcessingGridItem;

Или просто избавиться от обработчика событий и обработать свои логики c в установщике SelectedGeoCalibrationFolder. Вот как бы вы решили это с помощью MVVM.

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