使用IDataError验证Wpf datagrid是否重复

时间:2013-11-12 12:49:05

标签: wpf validation datagrid wpftoolkit

我有一个使用ObservableCollection绑定的数据网格。现在我想针对我的整个集合验证单元格中的重复条目。我使用IDataError进行验证。但是我的问题是如何在IDataError对象中获取集合。 修改

我的xaml是:

<dg:DataGrid Name="dgPurchaseReturnEntry" 
     ItemsSource="{Binding}" 
     SelectionUnit="CellOrRowHeader"
         >
<dg:DataGrid.Columns>
   <dg:DataGridComboBoxColumn 
                   Width="300"
                   Header="Product Name"
                   SelectedValueBinding="{Binding Path=Product_Id,UpdateSourceTrigger=PropertyChanged}"                                                                                       
                   SelectedValuePath="Product_Id"
                   DisplayMemberPath="Product_Name"                                           
                   ItemsSource="{Binding Source={StaticResource ProductDataProvider}}">
        <dg:DataGridComboBoxColumn.EditingElementStyle>
            <Style TargetType="ComboBox">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="true">
                        <Setter Property="ToolTip"
                            Value="{Binding RelativeSource={RelativeSource Self},
                            Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
                <Setter Property="IsEditable" Value="True" />
            </Style>

        </dg:DataGridComboBoxColumn.EditingElementStyle>
    </dg:DataGridComboBoxColumn>
</dg:DataGrid.Columns>

我的目标是:

public class clsPurchaseBillEntryList : INotifyPropertyChanged, IDataErrorInfo
{

    private int _Product_Id;

    #region Property Getters and Setters

    public int Product_Id
    {
        get { return _Product_Id; }
        set
        {
            _Product_Id = value;

            OnPropertyChanged("Product_Id");
        }

    #endregion

    #region INotifyPropertyChanged Members

    // Declare the event
    public event PropertyChangedEventHandler PropertyChanged;

    //// Create the OnPropertyChanged method to raise the event
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

    #endregion

    #region IDataErrorInfo Members

    public string Error
    {
        get
        {
            StringBuilder error = new StringBuilder();
            // iterate over all of the properties
            // of this object - aggregating any validation errors
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this);
            foreach (PropertyDescriptor prop in props)
            {
                string propertyError = this[prop.Name];
                if (!string.IsNullOrEmpty(propertyError))
                {
                    error.Append(propertyError);
                }
            }
            return error.ToString();
        }
    }

    public string this[string name]
    {
        get
        {
            string result = null;
            if (name == "Qty")
            {

            }

            return result;
        }
    }
}

现在如何在我的验证类中获取IDataError?

1 个答案:

答案 0 :(得分:0)

迭代集合中项目的能力不能也不应该在其中一个对象/项目中完成。考虑到这一点,标准IDataErrorInfo界面无法直接帮助解决此问题。但是,可以通过小型自定义验证项目唯一性。

基本思想是在数据类型的bass类中添加ExternalErrors属性,或者在类之外使用的单个数据类型类。通过这种方式,我们可以在视图模型中或在已定义集合属性的任何位置执行我们的唯一性检查,并将出现的任何错误提供给IDataErrorInfo接口功能。

我建议你不要再写出整个故事,而是要看一下我提供的早期答案,这些答案清楚地表明了这一点。有关详细信息,请查看我对Proper validation with MVVM问题的回答。如果您还有其他问题,请告诉我。