Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:Validation.ErrorTemplate未显示_Wpf_Validation_Mvvm_Idataerrorinfo - Fatal编程技术网

WPF:Validation.ErrorTemplate未显示

WPF:Validation.ErrorTemplate未显示,wpf,validation,mvvm,idataerrorinfo,Wpf,Validation,Mvvm,Idataerrorinfo,我有一个用于在控件周围显示红色边框和错误消息的模板。它可以工作(在文本框和组合框上测试)。但在两个特定的组合框上,它们没有。 让我们看看虚拟机有什么不同: 由于我在基类中有通用的验证实现,所以没有任何更改 显示的是同一种异步加载的数据,只需一个面板就可以很好地进行验证 因此,简言之,VM没有区别。 视图是完全相同的,应用了相同的样式,因此简言之,也没有区别 因此,我将NotifyOnValidationError=True添加到已经存在的validateOnDaerrors=True中,并订

我有一个用于在控件周围显示红色边框和错误消息的模板。它可以工作(在文本框和组合框上测试)。但在两个特定的组合框上,它们没有。
让我们看看虚拟机有什么不同:

  • 由于我在基类中有通用的验证实现,所以没有任何更改
  • 显示的是同一种异步加载的数据,只需一个面板就可以很好地进行验证
因此,简言之,VM没有区别。
视图是完全相同的,应用了相同的样式,因此简言之,也没有区别

因此,我将
NotifyOnValidationError=True
添加到已经存在的
validateOnDaerrors=True
中,并订阅了
Validation.Error
然后它发射了!!!但模板仍然没有显示我没有主意了,请给我建议一些要检查的东西

编辑:进一步研究:

我已经反编译了DataErrorValidationRule,并将其重新编译为MyDataErrorValidationRule,以尽可能接近原始版本。我删除了
validatesOnDaerRors=True
,并将我的ValidationRule添加到调试中。它返回
newvalidationresult(false,(object)str)与str一起包含两次正确的错误消息-一次用于将属性设置为null,一次用于强制验证整个对象模板仍不显示。

我还检查了控件上的Validation.GetErrorTemplate(在第一次触发Validation.Error时),它不是NULL,因此也不是
DynamicResource
失败

编辑:工作示例:

<ItemsControl ItemsSource="{Binding QuestionAnswers}">
                <ItemsControl.Resources>
                    <!-- ... -->
                    <DataTemplate DataType="{x:Type Model:QuestionAnswerModel}">
                        <StackPanel>
                                <!-- here is the combo box -->
                                <ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left" 
                                          Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}" 
                                          ItemsSource="{Binding Options.Source}"
                                          DisplayMemberPath="ItemName" SelectedValuePath="ItemID"
                                          SelectedValue="{Binding Options.SelectedID, ValidatesOnDataErrors=true}" />

                            </StackPanel>
                    </DataTemplate>
                </ItemsControl.Resources>
            </ItemsControl>
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
                          Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
                          SelectedItem="{Binding Type.SelectedItem, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Validation.Error="ComboBox_Error"
                          ItemsSource="{Binding Type.Source}"
                          DisplayMemberPath="Localized"
                          >

非工作示例:

<ItemsControl ItemsSource="{Binding QuestionAnswers}">
                <ItemsControl.Resources>
                    <!-- ... -->
                    <DataTemplate DataType="{x:Type Model:QuestionAnswerModel}">
                        <StackPanel>
                                <!-- here is the combo box -->
                                <ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left" 
                                          Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}" 
                                          ItemsSource="{Binding Options.Source}"
                                          DisplayMemberPath="ItemName" SelectedValuePath="ItemID"
                                          SelectedValue="{Binding Options.SelectedID, ValidatesOnDataErrors=true}" />

                            </StackPanel>
                    </DataTemplate>
                </ItemsControl.Resources>
            </ItemsControl>
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
                          Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
                          SelectedItem="{Binding Type.SelectedItem, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Validation.Error="ComboBox_Error"
                          ItemsSource="{Binding Type.Source}"
                          DisplayMemberPath="Localized"
                          >

它们来自同一个xaml文件,包含工作组合框的ItemsControl与非工作组合框位于同一个网格中


唯一的区别是SelectedItem还是SelectedValue是绑定的,但这与验证没有任何关系…

我遇到了错误模板无法显示的确切问题,即使事件正在发生,我也无法理解为什么它只发生在某些控件上,而不发生在其他控件上

我最终找到的解决方法是将绑定的
ValidationRule
上的
ValidationStep
设置为
ConvertedProposedValue

<TextBox>
  <TextBox.Text>
    <Binding Path="MyField">
      <Binding.ValidationRules>
        <Validation:MyValidationRule ValidationStep="ConvertedProposedValue" Message="Please enter a value." />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

不管怎么说,这似乎对我起了作用

编辑:如果您正在使用IDataErrorInfo,您可以尝试(尽管我还没有亲自测试):



i、 e.删除
validatesOnDaerRors=True
,这只是包含单个

的快捷方式,我将检查以下内容:

  • 检查组合框的datacontext和binding,如果它有效并且调用了IDataErrorInfo(我假设您进行了IDataErrorInfo验证)——下一步
  • 将验证模板作为本地资源复制到ComboBox.Resources中,并检查其是否有效

尽管如此,如果您发布您的验证模板、组合框xaml和datacontext,这将是一件好事

您能给我链接一些您是如何想到这一点的吗?我以前从未使用过手动验证规则!!!另外,消息应该来自数据(属性…),那么我如何填充它呢?我正在使用自己的类对System.Windows.Controls.ValidationRule进行子类化,以满足我的需要。如果您使用的是IDataErrorInfo,您可以尝试同样的方法(请参阅编辑的文章)。键入:
,我得到的异常:
验证规则“System.Windows.Controls.DataErrorValidationRule”接收到意外值“”。(这可能是由于为规则分配了错误的ValidationStep造成的。)
tAver:我对SelectedValue而不是SelectedItem进行了绑定,可以正常工作。已经有一段时间了,但我认为这对SelectedItem不起作用(免责声明:我可能在这里想到其他东西-就像我说的已经有一段时间了)。就像这样:第一个检查肯定有效,第二个检查-我想它也有效,由于“不工作”组合框下的文本框可以看到模板…我在原始帖子中添加了我的进一步研究。仍然不走运:(你能上传一个解决问题的工作示例吗?你能用Snoop检查你在运行时的设置吗?Validation.ErrorTemplate ValueSource应该是你案例中的样式。我不能让你的代码工作,因为我错过了验证内容等等。