【问题标题】:Issue with WPF validation(IDataErrorInfo) and tab focusingWPF 验证(IDataErrorInfo)和标签聚焦问题
【发布时间】:2010-03-01 12:20:07
【问题描述】:

我有一个TextBox 绑定到实现IDataErrorInfo 的对象的属性。 我设置了TextBoxValidation.ErrorTemplate,它工作正常。问题是我在TabControl 上有这些,如果我将选项卡更改为另一个选项卡然后返回到初始选项卡(TextBox 所在的位置),验证模板将不再显示。看起来是经过验证的(好像值是正确的),但实际上并没有。

这是IDataErrorInfo 对象 - 请注意,“正确”值是长度为 2 的字符串:

public class Presenter : IDataErrorInfo
{
    public Presenter()
    {
        this.Property = String.Empty;
    }

    public string Property { get; set; }

    public string Error { get { return null; } }

    public string this[string columnName]
    {
        get
        {
             if (columnName == "Property")
             {
                if (this.Property.Length == 2)
                   return null;
                else
                   return "Invalid property length!";
             }
             else return null;
        }
    }
}

这是 XAML:

<TabControl >
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus">
        <Grid>
            <TextBox Width="100" Height="20" x:Name="txtField">
                <TextBox.Style>
                    <Style TargetType="{x:Type TextBox}">
                        <Setter Property="Validation.ErrorTemplate">
                            <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="16"/>
                                    </Grid.ColumnDefinitions>
                                    <AdornedElementPlaceholder Grid.Column="0"/>
                                    <Image Source="bullets16.png" Grid.Column="1" ToolTip="{Binding CurrentItem.ErrorContent, Mode=OneWay}">
                                    </Image>
                                </Grid>
                            </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </TextBox.Style>
                <TextBox.Text>
                    <Binding Path="Property" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
                    </Binding>
                </TextBox.Text>
            </TextBox>
        </Grid>
    </TabItem>
    <TabItem Header="tabItem2" Name="tabItem2" >
        <Grid />
    </TabItem>
</TabControl>

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: c# wpf validation tabcontrol idataerrorinfo


    【解决方案1】:

    标签项往往会弄乱装饰器(虽然我不知道为什么,但我经历过)。

    我可以重现你的问题。

    通过用 AdornerDecorator 包装 TabItem 的内容来解决它。

    所以:

    <TabControl >
        <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus">
    
            <AdornerDecorator>
    
               <Grid>
               ....
               </Grid>
    
            </AdornerDecorator>
    
        </TabItem>
        ...
    </TabControl>
    

    【讨论】:

    • 这也是Expander的内容有问题,同样的解决方法。
    • 不是一个完整的解决方案。初始验证仅适用于第一个选定的选项卡项,其余选项在您稍后切换到它们时不会自动验证。我发现通过在 OnLoad 后面的代码中手动设置 DataContext 也可以解决这个问题,但它很难看。我仍在寻找解决方案...
    • 在针对 .NET 4.5.2 并使用 INotifyDataErrorInfo 而不是 IDataErrorInfo 时遇到了这个问题,这个解决方案非常适合我的用例。
    • 来自@akjoshi 的链接已失效。这是它的存档:web.archive.org/web/20150627034202/https://…
    【解决方案2】:

    我有问题,只有第一个(重点)选项卡有样式,并且只有那个在更改后仍然存在。这是我最终得到的解决方案(没有AdornerDecorator

    <Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="Validation.HasError" Value="True" />
                <Condition Property="IsVisible" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <DockPanel LastChildFill="True">
                            <Border BorderBrush="Red" BorderThickness="1">
                                <AdornedElementPlaceholder Name="controlWithError"/>
                            </Border>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="ToolTip" 
            Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
        </MultiTrigger>
    </Style.Triggers>
    

    根据这篇文章:http://techqa.info/programming/question/1369643/wpf-error-styles-only-being-rendered-properly-on-visible-tab-of-a-tab-control(不再存在)

    【讨论】:

    • 链接错误,转到付费网站。
    • 当时不是。已编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多