C# 如何将实现IDataErrorInfo的viewmodel绑定到UserControl并传播验证错误?
我编写了一个UserControl,它公开了一些依赖属性来修改控件的布局,也就是说,可以将它看作是一个通用类型安全的编辑器控件—因此,我的数据类型是通过日期选择器编辑的日期、通过组合框编辑的枚举和通过文本框编辑的数字。我还将3个编辑器控件的值作为依赖项属性公开,以便对其进行数据绑定 usercontrol中的控件都绑定到公开的依赖属性,以便在必要时使用适当的转换器获取它们的值 此控件形成了绑定到viewmodel的较大UI的一小部分-要编辑的值、自定义控件的datatype标志和可能的有效值列表都绑定到viewmodel中的对象 我的问题是:我在viewmodel上实现了IDataErrorInfo,并将自定义usercontrol中的控件绑定设置为ValidateSondaErrors=True,NotifyOnValidationError=True,但验证未显示 这是my usercontrol的XAML。除了依赖项属性声明之外,没有其他代码隐藏逻辑:C# 如何将实现IDataErrorInfo的viewmodel绑定到UserControl并传播验证错误?,c#,wpf,validation,data-binding,mvvm,C#,Wpf,Validation,Data Binding,Mvvm,我编写了一个UserControl,它公开了一些依赖属性来修改控件的布局,也就是说,可以将它看作是一个通用类型安全的编辑器控件—因此,我的数据类型是通过日期选择器编辑的日期、通过组合框编辑的枚举和通过文本框编辑的数字。我还将3个编辑器控件的值作为依赖项属性公开,以便对其进行数据绑定 usercontrol中的控件都绑定到公开的依赖属性,以便在必要时使用适当的转换器获取它们的值 此控件形成了绑定到viewmodel的较大UI的一小部分-要编辑的值、自定义控件的datatype标志和可能的有效值列表
<UserControl.Resources>
<!-- Converters -->
<local:ValidationBooleanToImageConverter x:Key="ValidationBooleanToImageConverter"/>
<local:ValidationErrorToStringConverter x:Key="ValidationErrorToStringConverter"/>
<local:DataTypeToVisibilityConverter DataType="Date" x:Key="DateDataTypeToVisibilityConverter"/>
<local:DataTypeToVisibilityConverter DataType="Numeric" x:Key="NumericDataTypeToVisibilityConverter"/>
<local:DataTypeToVisibilityConverter DataType="Enumeration" x:Key="EnumerationDataTypeToVisibilityConverter"/>
<local:DateToStringConverter x:Key="DateToStringConverter"/>
<!-- Styles -->
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem, Converter={StaticResource ResourceKey=ValidationErrorToStringConverter}}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="16"/>
</Grid.ColumnDefinitions>
<toolkit:DatePicker Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=DateDataTypeToVisibilityConverter}}" SelectedDate="{Binding Path=Value, ElementName=UserControl, Converter={StaticResource ResourceKey=DateToStringConverter}}"/>
<ComboBox Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=EnumerationDataTypeToVisibilityConverter}}" SelectedItem="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay}" ItemsSource="{Binding Path=Items, ElementName=UserControl}" />
<TextBox x:Name="_txtValue" Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=NumericDataTypeToVisibilityConverter}}" Text="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
<Image Grid.Column="2" Grid.Row="0" Source="{Binding ElementName=_txtValue, Path=(Validation.HasError), Converter={StaticResource ResourceKey=ValidationBooleanToImageConverter} }" ToolTip="{Binding ElementName=_txtValue, Path=ToolTip}" Width="16" Height="16"/>
</Grid>
…大视图中的usercontrol引用是
<control:ValueEditorControl DataType="{Binding Path=ContextualSelectedTagDataType}" Items="{Binding Path=ContextualSelectedTagItems}" Value="{Binding Path=ContextualSelectedTagDataObjectValue, Mode=TwoWay}" Height="25" VerticalAlignment="Top"/>
有人能给我指出正确的方向吗?您的虚拟机是否实现INotifyPropertyChanged?即使在WPF没有收到VM更改通知的情况下实现IDataErrorInfo,它也不会绑定到这些更改
也就是说,我会将您的工具提示设置器更改为:
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
如果您想要整个款式,我建议您:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<AdornedElementPlaceholder Name="controlWithError" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="Background" Value="LightPink"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
我认为您需要将IDataErrorInfo的实现与您绑定到的VM部分发布到Hanks以获得响应,Jose。我使用了Josh Smith描述的技术,以避免验证过程中出现本博客文章中描述的调试溢出。错误[0]引发异常:在回答您的问题时:是的,VM实现了INotifyPropertyChanged。@toadflakz Josh Smith的解决方法似乎不再必要了。在.Net 4.0中,它对我有效。错误[0]。输出中没有错误消息的错误内容。我仍然使用3.5 SP1。可能应该提到这一点-它肯定会抛出异常。