Проблема с проверкой WPF (IDataErrorInfo) и фокусировкой вкладок
У меня есть TextBox
привязан к свойству объекта, который реализует IDataErrorInfo
, Я настроил Validation.ErrorTemplate
из TextBox
и работает нормально. Проблема в том, что у меня есть эти на TabControl
и шаблон проверки больше не отображается, если я изменю вкладку на другую, а затем вернусь на начальную вкладку (где TextBox
является). Похоже, что это проверено (как значение является правильным), но на самом деле это не так.
Это IDataErrorInfo
object - обратите внимание, что "правильное" значение - это строка длиной 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>
Есть идеи, что я делаю не так?
2 ответа
Элементы вкладок имеют тенденцию путаться с украшениями (хотя я не знаю почему, я испытал это).
Я мог бы воспроизвести вашу проблему.
Решите это, обернув содержимое TabItem с AdornerDecorator.
Так:
<TabControl >
<TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus">
<AdornerDecorator>
<Grid>
....
</Grid>
</AdornerDecorator>
</TabItem>
...
</TabControl>
Вкладки, расширители и т. д. не очень хорошо работают с валидаторами - вам нужно включать adornerdecorators или вообще не использовать вкладки Проблема с проверкой WPF (IDataErrorInfo) и фокусировкой вкладок
У меня была проблема с тем, что только первая (сфокусированная) вкладка получила стиль, и только эта сохранилась после изменения. Это решение, которое я закончил (без 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