WPF DataGrid IDataErrorInfo无法通过DataBinding设置数据(Bug?)

时间:2011-05-18 13:28:22

标签: wpf validation datagrid

相关问题:WPF DataGrid Validation Bug?

您有以下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. 点击按钮,它会执行名称=“Something”; (是OnPropertyChanged被触发)。结果:DataGrid显示新值,但仍显示红色感叹号。
  3. 选择网格中的其他项目。 结果:先前所选项目再次包含无效数据!
  4. 这似乎是一个错误。但是我可以做些什么来改变底层的ViewModel(例如,如果我使用的是OpenFileDialog)

    视图模型:

    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设置为ItemViewModel的ObservableCollection

0 个答案:

没有答案