我开始通过IDataErrorInfo接口在我的WPF项目中实现验证.我的业务对象包含多个带有验证信息的属性.如何获取与该对象关联的所有错误消息的列表.我的想法是,这就是Error属性的用途,但我不能追踪任何使用它来报告多个属性的人.
谢谢!
public string this[string property]
{
get {
string msg = null;
switch (property)
{
case "LastName":
if (string.IsNullOrEmpty(LastName))
msg = "Need a last name";
break;
case "FirstName":
if (string.IsNullOrEmpty(LastName))
msg = "Need a first name";
break;
default:
throw new ArgumentException(
"Unrecognized property: " + property);
}
return msg;
}
}
public string Error
{
get
{
return null ;
}
}
Run Code Online (Sandbox Code Playgroud) 可以在winforms应用程序中正确使用IDataError信息吗?在过去,我以通常的方式(1)进行绑定,并在特定控件的OnValidating事件中进行验证.我想将数据验证移动到域模型,以便我可以轻松地交换用户界面,以便所有逻辑都在一个地方.
我正在研究IDataErrorInfo,但我发现的所有内容都与WPF有关,开发中的应用程序严格来说是一个winforms应用程序.
我还注意到在WPF中使用的绑定是在System.Windows.Data中,我一直使用的绑定是在System.Windows.Forms中(当我尝试添加它时,我似乎没有作为一种资源 - 我正在使用3.5).来自属性"ValidatesOnDataErrors"的两者之间有区别吗?
(1)通常的方式是:
myControl.DataBindings.Add(new Binding("Text", this.domainModel, "Property"));
Run Code Online (Sandbox Code Playgroud) 作为一个新的WPF程序员,我无法找到两种不同的方式来验证用户输入:
编写自定义验证规则以实现IDataErrorInfo的优缺点是什么,反之亦然?什么时候我比较喜欢一个?
更新:
虽然我已经得到了答案,但我找到了可能对其他人有帮助的相关文章.
如何让WPF错误模板出现在WPF中UserControl的控件上?
我有一个UserControl包含两个标签,两个TextBox和一个CheckBox.其中一个TextBoxes表示实体的名称,它绑定到ViewModel公开的Model属性的Name属性,该属性是我的Window的DataContext.Model类实现了IDataErrorInfo接口,我通过单元测试确认,当Name为空时,通过属性索引器实现返回错误.我已经绑定了支持UserControl中的Name TextBox的Dependency Property,当遇到验证错误时,WPF错误模板在整个UserControl周围放置一个红色边框,而不仅仅是Name TextBox.
绑定到UserControl的名称字段如下.
<vc:MyUserControl ItemName="{Binding Model.Name, ValidatesOnDataErrors=True}" />
Run Code Online (Sandbox Code Playgroud)
我的UserControl的简化版本和支持DependencyProperty如下所示.
<UserControl>
<Grid>
<TextBox Text="{Binding ItemName}" />
</Grid>
</UserControl>
public partial class MyUserControl: UserControl
{
public static readonly DependencyProperty ItemNameProperty =
DependencyProperty.Register(
"ItemName",
typeof(string),
typeof(MyUserControl),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
public string ItemName
{
get { return (string)GetValue(ItemNameProperty); }
set { SetValue(ItemNameProperty, value); }
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的与此问题有关的信息都是关于Silverlight或使用转换器不显示红色边框(这对我来说没有意义).这些信息都在stackoverflow上找到.
有没有人能用WPF解决这个问题?我忽略了一些明显的东西吗
我目前正在寻找我的WPF应用程序的验证,并看到提到IDataErrorInfo.但是,很少有如何使用它的指南,更糟糕的是没有人解释它是如何工作的.
在MSND.com网站,这是得到安宁 MSDN
public class Person : IDataErrorInfo
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public string Error
{
get
{
return null;
}
}
public string this[string name]
{
get
{
string result = null;
if (name == "Age")
{
if (this.age < 0 || this.age > 150)
{
result = "Age must not be less than 0 or greater than 150.";
}
} …Run Code Online (Sandbox Code Playgroud) DataAnnotations与IDataErrorInfo
两者的优点和缺点?一个优于另一个的好处?(特别是与MVC有关)
我有一个WPFapplication(.Net 3.5),它使用IDataErrorInfoViewModel来验证输入.
它运行良好,用户控制获得正确的UI反馈.
问题是用户仍然可以更改所选元素,或保存此元素.
所以我的问题是:我怎么知道我的所有财产都有效?或者至少我所有显示的值都是有效的.目标是IsActive在这个结果上绑定一些
我有一个使用MVVM模式的应用程序,我想在用户填写信息时实现验证.
我想使用IDataErrorInfo,但我不知道我的视图模型是否实现了该接口,或者我创建新类是否更好.使用IDataErrorInfo和MVVM模式实现验证的最佳方法是什么?
编辑:我看到在一些例子中,实现是在模型中(它与视图模型不同),但在我的情况下,模型基本上是我在创建edmx模型时从数据库创建的POCO实体实体框架,所以我想避免修改这个实体所需要的,因为如果我不需要更新我的模型,我将不得不重新开始工作.
谢谢.
我错过了什么?
1-风格
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Validation.HasError}" Value="true">
<Setter Property="BorderBrush" Value="Blue" />
</DataTrigger>
</Style.Triggers>
<Setter Property="MinWidth" Value="160" />
<Setter Property="Margin" Value="0 7 0 0"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
2 - Viewmodel在视图中实现IDataErrorInfo 3- textBox
<TextBox x:Name="FirstName" Text="{Binding Person.FirstName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=true}"></TextBox>
Run Code Online (Sandbox Code Playgroud)
3 - 我使用Caliburn MVVM
我"BindingExpression路径错误:对 '对象' '' PersonWindowViewModel未找到 '验证' 属性 '(的HashCode = 38783181)' BindingExpression:路径= Validation.HasError;的DataItem = 'PersonWindowViewModel'(的HashCode = 38783181);目标元件是'TextBox'(Name ='FirstName'); target属性为'NoTarget'(类型'Object')"S
使用MVVM.我有一个DataTemplate用于显示扩展器的扩展器,每个对象都有一些控件.
<DataTemplate>
<Expander ExpandDirection="Down" IsExpanded="False">
<Expander.Header>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Platform Group {0} {1}">
<Binding Path="PlatformGroupCode"/>
<Binding Path="PlatformGroupName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Expander.Header>
<vw:PlatformGroup HorizontalAlignment="Left"/>
</Expander>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
在该视图内部是绑定到这2个属性的2个文本框.我IDataErrorInfo在我的VM中使用进行验证,我在主应用程序资源中使用了一种样式,将错误消息显示为工具提示:
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
添加新组时,2个属性具有默认值,这是无效的,因此我希望文本框为红色以提示用户输入数据.如果Expander的IsExpanded设置为true,则此方法有效.但如果它是假的,我必须扩展并更改其中一个文本框中的值,以便显示红色边框和工具提示.
我不想将扩展器设置为扩展,因为最终会有很多控件.扩展器扩展后如何才能显示红色边框?更好的是,是否有办法使新添加的扩展器扩展(当用户添加新组时,我将PlatformGroupviewModel添加到observablecollectionPlatformGroupviewModel中)?
编辑更多细节:顶级视图:
<StackPanel Orientation="Vertical">
<ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="630">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="5*" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Vertical" Grid.ColumnSpan="2" Grid.Row="1" HorizontalAlignment="Stretch"> …Run Code Online (Sandbox Code Playgroud) idataerrorinfo ×10
wpf ×8
validation ×6
mvvm ×5
c# ×3
.net ×1
asp.net-mvc ×1
caliburn ×1
expander ×1
winforms ×1