входная строка была не в правильном формате.GenerateEditingElement Столбец комбинированного списка данных - PullRequest
0 голосов
/ 01 мая 2019

Исключение: Входная строка была в неправильном формате

Я не уверен, как я получаю это.Это происходит только тогда, когда я пытаюсь повторно войти в ячейку, когда значение уже размещено.Поэтому, если пользователь хочет отредактировать то, что он ранее ввел, он создает это исключение.

У меня есть это переопределение, чтобы я мог использовать свойство IsEditable.

Это вызывает исключение после запуска функции GenerateEditingElement.Если я пропущу код для отладки, я получу это.

Ваше приложение перешло в состояние останова, но нет кода для показа, потому что все потоки выполняли внешний код (обычно системный или структурный код).

public class DataGridComboBoxColumn : DataGridBoundColumn {
    public Binding ItemsSourceBinding { get; set; }
    public string DisplayMemberPath { get; set; }
    public string SelectedValuePath { get; set; }
    public object ItemSource { get; set; }
    public int SelectedIndex { get; set; } = -1;

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) {
        var textBox = new TextBlock();
        if (Binding != null) {
            BindingOperations.SetBinding(textBox, TextBlock.TextProperty, Binding);
        }
        return textBox;
    }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) {
        var comboBox = new ComboBox { IsEditable = true };
        if (Binding != null && ItemsSourceBinding != null) {

            comboBox.DisplayMemberPath = DisplayMemberPath;
            comboBox.SelectedValuePath = SelectedValuePath;

            BindingOperations.SetBinding(comboBox, ComboBox.SelectedValueProperty, Binding);
            BindingOperations.SetBinding(comboBox, ComboBox.ItemsSourceProperty, ItemsSourceBinding);

        }
        return comboBox;
    }

    protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs) {
        var comboBox = editingElement as ComboBox;
        if (comboBox == null) return null;
        if (SelectedIndex != -1 ) { comboBox.SelectedIndex = SelectedIndex; } else { comboBox.SelectedIndex = -1; }
        comboBox.Focus(); // This solves the double-tabbing problem that Nick mentioned.
        return comboBox.Text;
    }

    protected override bool CommitCellEdit(FrameworkElement editingElement) {
        return base.CommitCellEdit(editingElement);
    }

    protected override void CancelCellEdit(FrameworkElement editingElement, object uneditedValue) {
        base.CancelCellEdit(editingElement, uneditedValue);
    }
}

XAML

<local:DataGridComboBoxColumn Header="Prod #" x:Name="cboProd" Width="60" Binding="{Binding ProductNum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="ProductNum" SelectedValuePath="ProductsID" ItemsSourceBinding="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:PurMaterialEntry}}, Path=PDN}"/>

PDN - это моя коллекция номеров продуктов проекта в поле со списком рядом с ним.

Что я ищу.
- Я хочу очистить ячейку при повторном входе.
- этим управляет проект ComboBox в сетке.

Изображение, показывающее, что комбинированный список работает во время ввода.

Но если мне нужно изменитьпродукт D101 исключение происходит.

...