WPF DataGrid IDataErrorInfo не может установить данные через привязку данных (ошибка?) - PullRequest
2 голосов
/ 18 мая 2011

Смежный вопрос: Ошибка проверки WPG DataGrid?

У вас есть следующая DataGrid

<DataGrid ItemsSource="{Binding .}" AutoGenerateColumns="False" x:Name="dg">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name, ValidatesOnDataErrors=True}" Header="Name" />

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Command="{Binding ChangeNameCommand}">...</Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>
</DataGrid>
  1. Введите некоторые недействительные данные
  2. Нажмите на кнопку, которая будет делать что-то вроде Name = "Something";(Да, OnPropertyChanged запущен).Результат: DataGrid показывает новое значение, но все еще красный восклицательный знак.
  3. Выберите другой элемент в сетке.Результат: предыдущий выбранный элемент снова содержит неверные данные!

Кажется, это ошибка.Но что я могу сделать, чтобы изменить базовую ViewModel (например, если я использую OpenFileDialog)

ViewModel:

public class ItemViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            if (_name == "Error")
                return "Name is Error";

            return string.Empty;
        }
    }

    public ICommand ChangeNameCommand { get; protected set; }

    public ItemViewModel()
    {
        ChangeNameCommand = new RelayCommand(() => { Name = "Another Name"; });
    }
}

DataContext установлен в ObservableCollection ItemViewModel

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