Как получить ячейку DataGrid, чтобы пользователь не мог ввести неправильное значение? - PullRequest
0 голосов
/ 01 июля 2011

Я ознакомился со статьей Как выполнить проверку с помощью элемента управления DataGrid , хотя это не мешает пользователю покинуть ячейку, я хочу оставить ячейку сфокусированной. Рассмотрим ячейку, привязанную к целочисленному значению, попытка ввести буквенный символ не позволит удалить фокус из ячейки.

Моя сетка выглядит следующим образом:

<DataGrid HeadersVisibility="Column"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          CanUserDeleteRows="False"
          CanUserResizeRows="False"
          ItemsSource="{Binding SelectedLines}">
    <DataGrid.RowValidationRules>
        <ExceptionValidationRule />
    </DataGrid.RowValidationRules>
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn IsReadOnly="False" Header="Qty"
                            Binding="{Binding Quantity, ValidatesOnExceptions=True}"/>
    </DataGrid.Columns>
</DataGrid>

Мой источник данных - это ObservableCollection объекта, подобного следующему:

public class MyEntry : INotifyPropertyChanged /*, IEditableObject*/ {
    public MyEntry(string name) {
        this.Name = name;
        this.Quantity = 1;
    }
    public string Name {
        get;
        private set;
    }
    private int quantity;
    public int Quantity {
        get { return quantity; }
        set {
            if (quantity != value) {
                if (value < 1)
                    throw new ArgumentException("Quantity may not be less than 1.");
                if (value > 100)
                    throw new ArgumentException("Quantity may not be more than 100.");
                quantity = value;

                OnPropertyChanged("Quantity");
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    #region IEditableObject Members
    private int backupQuantity;
    private bool inEdit;
    public void BeginEdit() {
        if (inEdit) return;
        inEdit = true;
        backupQuantity = this.Quantity;
    }
    public void CancelEdit() {
        if (!inEdit) return;
        inEdit = false;
        this.Quantity = backupQuantity;
    }
    public void EndEdit() {
        if (!inEdit) return;
        inEdit = false;
        backupQuantity = 0;
    }
    #endregion
}

Независимо от того, что я делаю, сетка не показывает есть ошибка, то есть нет красной рамки вокруг ячейки, далее я хочу, чтобы пользователь оставил фокус. Если я введу 'x' в ячейку, он будет вести себя правильно, хотя если я введу -1, он не зафиксирует значение, потому что сетка не позволит мне попытаться отредактировать другую строку, и нажатие Escape вернет исходную ячейку, чтобы вернуться это правильно.

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

1 Ответ

0 голосов
/ 01 июля 2011

в вашем особом случае ваша сетка данных не может сказать, что что-то не так, потому что базовые данные не замечены, что-то не так.Например, вы устанавливаете значение xyz - тогда единственное, что поднимает, это исключение привязки, но xyz никогда не сойдет к вашему виртуальному компьютеру.

- это общая проблема в mvvm и wpf.В большинстве случаев я использую строки и интерфейс IDataErrorInfo в моих моделях просмотра и замаскированное текстовое поле для ввода в моем пользовательском интерфейсе.Преимущество этого заключается в том, что я могу обрабатывать каждый ввод в мой виртуальный IDataErrorInterface.но у меня есть немного больше работы, чтобы сопоставить строку с правильным типом моей модели (например, строка из vm в int в модели).

если вы посмотрите на свое окно вывода во время отладки, вы увидите исключение bindingexception.

я знаю, что это не настоящий ответ ...

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