我有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;
}
}
}
关于我做错的任何想法?
答案 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>