C # WPF DataGrid Редактируемый ComboBox Возвращает -1 как выбранную строку с правкой одним щелчком мыши - PullRequest
0 голосов
/ 24 августа 2018

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

Проблема: RowIndex становится равным -1 (при вводе текста одним щелчком мыши), как будто строка не выбрана, что приводит к сбою кода и неправильной обработке обновления.

Как я могу это исправить? Если принудительное использование пользователем двойного щелчка является допустимым вариантом, как мне это сделать?

Вот мой код C #:

private void ComboBox_LostFocus(object sender, RoutedEventArgs e)
        {
            if (e != null)
            {
                TextBox t = e.Source as TextBox;
                if (t != null)
                {
                    try
                    {
                        int RowIndex = MYGRID.Items.IndexOf(MYGRID.SelectedItem);
                        if (RowIndex < 0)
                        {
                            MessageBox.Show("Index < 0"); //For Testing
                        }
                        //Obtain new Value
                        string Value = t.Text.ToString();
                        //Obtain item ID
                        DataGridRow Row = (DataGridRow)MYGRID.ItemContainerGenerator.ContainerFromIndex(RowIndex);
                        DataGridCell RowColumn = MYGRID.Columns[0].GetCellContent(Row).Parent as DataGridCell;
                        int ID = Convert.ToInt32(((TextBlock)RowColumn.Content).Text);

                        //Unrelated code continues...

                        }
                        catch (Exception) { }
                    }
                }

            }

Вот мой код XAML для столбца:

        <DataGridTemplateColumn x:Name="ValueCol" Header="Value">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox  ItemsSource="{Binding Options, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=UpdatedData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True}" IsEditable="True" LostFocus="ComboBox_LostFocus"  />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

1 Ответ

0 голосов
/ 24 августа 2018

Не уверен, что вы делаете, но если вы просто хотите прочитать Text из ComboBox, просто используйте чувак отправителя!

private void ComboBox_LostFocus(Object sender, RoutedEventArgs e)
{
    var comboBox = sender as ComboBox;
    if (comboBox != null)
    {
        int id;
        if(int.TryParse(comboBox.Text, out id))
        {
            // do your thing!!!!
        }
    }
}

Для получения индекса вы можете использовать следующий вспомогательный метод:

public static DependencyObject GetParent<T>(DependencyObject child)
{
    if (child == null) return null;

    var parent = VisualTreeHelper.GetParent(child);
    return parent is T ? parent : GetParent<T>(parent);
}

Использование

var index = ((DataGridRow)GetParent<DataGridRow>(comboBox))?.GetIndex();

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