WPF验证(IDataErrorInfo)和选项卡聚焦问题

时间:2010-03-01 12:20:07

标签: c# wpf validation tabcontrol idataerrorinfo

我有TextBox绑定到实现IDataErrorInfo的对象的属性。 我设置了Validation.ErrorTemplate的{​​{1}},它运行正常。问题是我在TextBox上有这些,如果我将标签更改为另一个标签,然后返回初始标签(TabControl所在的位置),验证模板将不再显示)。它看起来像是经过验证的(就像值是正确的一样),但实际上并非如此。

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

IDataErrorInfo

这是XAML:

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;
        }
    }
}

关于我做错的任何想法?

2 个答案:

答案 0 :(得分:29)

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

我可以重现你的问题。

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

所以:

<TabControl >
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus">

        <AdornerDecorator>

           <Grid>
           ....
           </Grid>

        </AdornerDecorator>

    </TabItem>
    ...
</TabControl>

答案 1 :(得分:0)

我遇到的问题是只有第一个(聚焦)标签获得样式,并且只有一个在更改后保持不变。这是我最终得到的解决方案(没有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