8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

更改选项卡时 WPF 验证停止工作

Frederik 1月前

42 0

我有一个 WPF 应用程序,其中有一个 TabControl,并且在某个选项卡内有一个带有验证规则的 TextBox。验证规则运行良好,转换器运行良好,绑定正常......

我有一个 WPF 应用程序,其中有一个 TabControl ,并且在某个选项卡内有一个 TextBox 带有验证规则的。

验证规则运行良好,转换器运行良好,绑定也正常。
但是当我这样做时会出现一个非常烦人的错误(可能是 WPF 本身的问题):

  • 输入无效文本(验证通过,文本框出现红色边框)
  • 切换到另一个选项卡
  • 返回到带有文本框的选项卡。

验证完全停止工作,直到我输入 有效的 文本,然后它才重新开始工作。更改文本是不够的,只有在我输入有效的文本时它才会重新开始工作。

当我进入标签时,如何强制重新验证文本?


我已经尝试了 这里列出的 ,但它们似乎没有带来红色边框:

  • 事件中 Selector.Selected (检查它是否被调用),添加 txtName.GetBindingExpression(TextBox.TextProperty).UpdateSource();
  • 在验证规则中 ValidatesOnTargetUpdated="True" 使用该

如果需要的话,这是 XAML 的简短描述:

<TabControl ...>
    <TabItem ... />
    <TabItem ...>
        ...
        <TextBox Name="txtName" ...>
            <TextBox.Text>
                <Binding Path="..." 
                         UpdateSourceTrigger="PropertyChanged" 
                         Mode="OneWayToSource"
                         FallbackValue="5"
                         Converter="MyCustomConverterWorkingOk">

                     <Binding.ValidationRules>
                         <local:MyCustomValidationWorkingOk/>
                     </Binding.ValidationRules>
                </Binding> 
            </TextBox.Text>
        </TextBox>
    </TabItem>
</TabControl>
帖子版权声明 1、本帖标题:更改选项卡时 WPF 验证停止工作
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Frederik在本站《wpf》版块原创发布, 转载请注明出处!
最新回复 (0)
  • M.O. 1月前 0 只看Ta
    引用 2

    出现此行为的原因在于 TabControl 显示其内容的方式:所有选项卡共享相同的 ContentPresenter 对于呈现错误模板的 , AdornerLayer 情况也是如此

    当删除选项卡内容时, Adorner 渲染验证错误模板的 也将被删除。由于 是 AdornerLayer 无状态的,并且 TabControl 不会监视所有可能的装饰器,因此无法恢复先前选项卡内容的旧渲染错误模板。

    你有三个不错的选择:

    1. 不允许用户离开标签页,除非标签页的数据处于有效状态或
    2. 离开标签页时丢弃无效数据(这也会重置相关错误)或
    3. 包含无效数据输入 AdornerLayer 强制 TabItem 重新渲染

    下面的示例展示了如何 AdornerLayer 在装饰元素可见时强制再次 TextBox 渲染所有元素的装饰器

    <!-- Custom error template -->
    <ControlTemplate x:Key="ValidationErrorTemplate">
      <StackPanel>
    
        <!-- Placeholder for the TextBox itself -->
        <AdornedElementPlaceholder />
    
        <TextBlock Text="{Binding ErrorContent}"
                   Foreground="Red" />
      </StackPanel>
    </ControlTemplate>
    
    <!-- Style to trigger the rendering of the AdornerLayer by setting the error template -->
    <Style TargetType="TextBox">
      <Setter Property="Validation.ErrorTemplate"
              Value="{x:Null}" />
      <Style.Triggers>
        <MultiTrigger>
          <MultiTrigger.Conditions>
            <Condition Property="Validation.HasError"
                       Value="True" />
            <Condition Property="IsVisible"
                       Value="True" />
          </MultiTrigger.Conditions>
          <Setter Property="Validation.ErrorTemplate"
                  Value="{StaticResource ValidationErrorTemplate}" />
        </MultiTrigger>
      </Style.Triggers>
    </Style>
    
  • 为每个 TabItem 赋予其自己的 AdornerLayer(通过 AdornerDecorator 元素),如下所示。装饰层中的元素将在选项卡切换时保持。

    <TabItem Header="Tab 1">
        <AdornerDecorator>
            <Grid Background="WhiteSmoke">
                <TextBlock Text="Hello from #1" />
            </Grid>
        </AdornerDecorator>
    </TabItem>
    
    <TabItem Header="Tab 2">
        <AdornerDecorator>
            <Grid Background="WhiteSmoke">
                <TextBlock Text="Hello from #2" />
            </Grid>
        </AdornerDecorator>
    </TabItem>
    
  • 不确定,但可以尝试这个:

    string text = txtName.Text;
    txtName.Text = null;
    txtName.Text = text;
    
返回
作者最近主题: