这个问题可能非常简单,但是我找不到解决方法,所以我问了一下。

我在模型中使用IDataErrorInfo对其进行了如下验证:

public class Group : INotifyPropertyChanged, IDataErrorInfo
{
    //Fileds & Properties

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

    public string this[string columnName]
    {
        get 
        {

            if (columnName == "GroupName")
            {
                bool _IsDuplicateGroupName;

                using (MunimPlusContext context = new MunimPlusContext())
                {
                    _IsDuplicateGroupName = context.GroupSet.Any(x => x.GroupName.ToLower() == GroupName.ToLower());
                }

                if (String.IsNullOrWhiteSpace(GroupName))
                {
                    return "Group Name cannot be Empty.";
                }
                else if (_IsDuplicateGroupName)
                {
                    return "Duplicate Group Name. Please choose a unique Group Name.";
                }
            }

            if (columnName == "ParentId")
            {
                if (ParentId == null)
                {
                    return "Please select Under Group under which " + (GroupName == null ? "this" : GroupName) + " Group will appear.";
                }
                else if (ParentId <= 0)
                {
                    return "Please select a valid GroupName from the list.";
                }
            }

            if (columnName == "NatureOfGroupId")
            {
                Group _PrimaryGroup;
                using (MunimPlusContext context = new MunimPlusContext())
                {
                    _PrimaryGroup = context.GroupSet.Where(x => x.GroupName == "Primary").FirstOrDefault();
                }

                if (_PrimaryGroup.GroupId == ParentId)
                {
                    if (NatureOfGroupId == null)
                    {
                        return "Please select the Nature of Group.";
                    }
                    else if (NatureOfGroupId <= 0)
                    {
                        return "Please select a valid Nature of Group from the list.";
                    }
                }
            }

            return String.Empty;
        }
    }
}

现在,在我的XAML中:

<Grid.Resources>
    <DataTemplate DataType="{x:Type ValidationError}">
        <TextBlock FontStyle="Italic" Foreground="Red" HorizontalAlignment="Right" Text="{Binding ErrorContent}" Margin="4,0,4,4" />
    </DataTemplate>
</Grid.Resources>

<TextBlock Grid.Row="3" Grid.Column="1" Text="Name" />
<TextBlock Grid.Row="3" Grid.Column="1" Text=":" />
<TextBox Grid.Row="3" Grid.Column="2" x:Name="txtGroupName" Text="{Binding GroupName, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
<ContentPresenter Grid.Row="4" Grid.Column="2" Content="{Binding ElementName=txtGroupName, Path=(Validation.Errors).CurrentItem}" />

<TextBlock Grid.Row="5" Grid.Column="1" Text="Alias" />
<TextBlock Grid.Row="5" Grid.Column="1" Text=":" />
<TextBox Grid.Row="5" Grid.Column="2" x:Name="txtAlias" Text="{Binding Alias, ValidatesOnDataErrors=True}"/>
<ContentPresenter Grid.Row="6" Grid.Column="2" Content="{Binding ElementName=txtAlias, Path=(Validation.Errors).CurrentItem}" />

<TextBlock Grid.Row="7" Grid.Column="1" Text="Under" />
<TextBlock Grid.Row="7" Grid.Column="1" Text=":" />
<ComboBox Grid.Row="7" Grid.Column="2" x:Name="cmbParentGroup"
          ItemsSource="{DynamicResource Items}" SelectedValue="{Binding ParentId, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
          SelectedValuePath="Group.GroupId" Grid.IsSharedSizeScope="True" TextSearch.TextPath="Group.GroupName" LostFocus="cmbParentGroup_LostFocus"/>
<ContentPresenter Grid.Row="8" Grid.Column="2" Content="{Binding ElementName=cmbParentGroup, Path=(Validation.Errors).CurrentItem}" />

<TextBlock Grid.Row="9" Grid.Column="1" Text="Nature Of Group" />
<TextBlock Grid.Row="9" Grid.Column="1" Text=":" />
<ComboBox Grid.Row="9" Grid.Column="2" x:Name="cmbNatureOfGroup"
          ItemsSource="{Binding DataContext.NaturesOfGroup, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type core:UserControlViewBase}}}" 
          DisplayMemberPath="Nature" SelectedValue="{Binding NatureOfGroupId, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
          SelectedValuePath="NatureOfGroupId" LostFocus="cmbNatureOfGroup_LostFocus"/>
<ContentPresenter Grid.Row="10" Grid.Column="2" Content="{Binding ElementName=cmbNatureOfGroup, Path=(Validation.Errors).CurrentItem}" />

<StackPanel Grid.Row="11" Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right">
    <Button Content="Save" Style="{StaticResource SaveButtonWithText}" 
            Command="{Binding DataContext.SaveCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type core:UserControlViewBase}}}"/>
    <Button Content="Cancel" Style="{StaticResource CancelButtonWithText}"
            Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type core:UserControlViewBase}}}"/>
</StackPanel>

现在,当我将数据保存到数据库时,我想检查我的模型是否有效。 我该怎么办?

#1楼 票数:1 已采纳

最后,从这篇文章中得到了我的答案。

这是我的IDataErrorInfo实现代码:

public string Error
{
    get { return null; }
}

public string this[string propertyName]
{
    get { return GetValidationError(propertyName); }
}

private static readonly string[] ValidatedProperties = { "GroupName", "ParentId", "NatureOfGroupId" };

public bool IsValid
{
    get
    {
        foreach (string property in ValidatedProperties)
        {
            if (GetValidationError(property) != null)
            {
                return false;
            }
        }
        return true;
    }
}

private string GetValidationError(string propertyName)
{
    string error = null;

    switch (propertyName)
    {
        case "GroupName":

            bool _IsDuplicateGroupName;

            using (MunimPlusContext context = new MunimPlusContext())
            {
                _IsDuplicateGroupName = context.GroupSet.Any(x => x.GroupName.ToLower() == GroupName.ToLower());
            }

            if (String.IsNullOrWhiteSpace(GroupName))
            {
                error = "Group Name cannot be Empty.";
            }
            else if (_IsDuplicateGroupName)
            {
                error = "Duplicate Group Name. Please choose a unique Group Name.";
            }

            break;

        case "ParentId":

            if (ParentId == null)
            {
                error = "Please select Under Group under which " + (GroupName == null ? "this" : GroupName) + " Group will appear.";
            }
            else if (ParentId <= 0)
            {
                error = "Please select a valid GroupName from the list.";
            }

            break;

        case "NatureOfGroupId":

            Group _PrimaryGroup;
            using (MunimPlusContext context = new MunimPlusContext())
            {
                _PrimaryGroup = context.GroupSet.Where(x => x.GroupName == "Primary").FirstOrDefault();
            }

            if (_PrimaryGroup.GroupId == ParentId)
            {
                if (NatureOfGroupId == null)
                {
                    error = "Please select the Nature of Group.";
                }
                else if (NatureOfGroupId <= 0)
                {
                    error = "Please select a valid Nature of Group from the list.";
                }
            }

            break;

    }

    return error;

}

这是我如何检查所有属性是否对名为CurrentGroup的对象有效的方法?

if (CurrentGroup.IsValid)
{
       //save data to the database.......
}

#2楼 票数:0

在您的类中创建一个实现IDataErrorInfo的布尔方法,如果发现任何错误,该方法将返回false;如果一切正常,则返回true。

private bool IsValid()
    {
        if (this[nameof(Property1)] != null ||
            this[nameof(Property2)] != null ||
            this[nameof(Property3)] != null ||
            .....
            this[nameof(PropertyX)] != null)
        {
            return false;
        }

        return true;
    }

如果使用以下方法,则此方法有效:

 public string this[string columnName]

如果一切正常,则返回null。 如果此方法返回string.Empty,则将示例修改为:

private bool IsValid()
    {
        if (string.IsNullOrEmpty(this[nameof(Property1)]) &&
            string.IsNullOrEmpty(this[nameof(Property2)]) &&
            string.IsNullOrEmpty(this[nameof(Property3)]) &&
            .....
            string.IsNullOrEmpty(this[nameof(PropertyX)]))
        {
            return true;
        }

        return false;
    }

  ask by Vishal translate from so

未解决问题?本站智能推荐:

1回复

使用IDataErrorInfo进行验证时,在每个文本框中显示所有错误消息

在根据一个属性(文本框)显示所有验证时,我遇到了一个小问题。 现在,我的验证工作如下: 文本框在开始时无聊,显示为红色,每个文本框仅显示一条错误消息。 当我在具有许多验证器的文本框中编写内容时,它们会依次出现。 我要实现的目标: 文本框的边框在开始时为红色,并在文
2回复

在使用IDataErrorInfo在MVVM中执行验证时,我应该在哪里执行检查以查看数据库中是否已存在值?

开始使用所有这些MVVM的东西,我正在关注Josh Smith的这篇文章,该文章讨论了使用MVVM时的验证方法。 这个例子很简单,我开始想知道如何在我自己的应用程序中使用它。 在我的BLL中,我有一个BookInfo类,它实现IDataErrorInfo来报告无效值,例如“发布日期不能在
2回复

使用IDataErrorInfo或任何类似的模式传播错误消息

我为这个问题道歉,因为它相当模糊,并且有几个问题已经整合,但由于它们密切相关,我不想将它们分成几个提交。 我目前正在考虑如何在应用程序中测试配置错误。 有不同的选项,之前使用过的是IDataErrorInfo接口。 我对这个实现的外观并不十分满意,不是因为它不起作用,而是因为它不完全同
1回复

检查是否有任何WPF DataGrid单元格有错误

我在单元格上设置了验证,它按预期工作(在文本框周围放置一个红色突出显示,并添加错误的工具提示)。 但是,如果我尝试访问Valgen.GetHasError(TheGrid),其中TheGrid是我的DataGrid,它始终为false。 有谁知道如何检查DataGrid中的任何单元格是否有错
2回复

如何检查String是否是WPF中FrameworkElement的有效名称?

在我的代码中,我将一个String分配给FrameworkElement的name属性 。 此String是从应用程序的另一部分自动生成的,表示Java源代码中的方法名称,因此我想检查它是否包含有效名称。 目前我这样做: 但问题是我不知道要替换哪些字母。 例如,在这个代码中[和
1回复

通过属性进行WPF验证检查属性是否有效

我的C#WPF应用程序中有一个ViewModel ,它包含几个像这样的属性 这是我的ValidationViewModelBase类 这是我在XAML中的TextBox 属性正在运行,当属性变为无效时会正确通知UI(触发“无效” VisualState )。 问题是
3回复

如何使用IDataErrorInfo强制验证错误更新ViewModel中的View?

我有一个基于MVVM的窗口,有很多控件,我的Model实现了IDataErrorInfo 。 还有一个SaveCommand按钮,它通过分析Model.Error属性来执行验证。 仅当我更改特定控件的值时,或者当我使用PropertyChanged通知有关该属性的更改时,视图才会显示
1回复

使用IDataErrorInfo时,属性设置器中的执行顺序是什么?

情况:在WPF中,很多时候,我们使用INotifyPropertyChanged和IDataErrorInfo在数据对象上启用绑定和验证。 我有很多看起来像这样的属性: 当然,我在类中有一个适当的重写IDataErrorInfo.this[]来进行验证。 问题:在有约束力的情况下