WPF ContentControl ErrorTemplate

时间:2011-08-01 07:14:37

标签: wpf validation enterprise-library

我的内容控件有2个数据模板,如下所示;

<ContentControl Content="{Binding ContentViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">                    
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:TypeA}">
<vs:TypeAView  />
</DataTemplate>                            

<DataTemplate DataType="{x:Type vm:TypeB}">
<vs:TypeBView  />                                
</DataTemplate>
</ContentControl.Resources>
</ContentControl>

我的问题是TypeA视图和TypeB视图都有一个绑定到Name属性的文本框。在我的包含控件上,当从树视图中选择一个项目时,将设置ContentViewModel属性。

数据显示,可以根据需要进行编辑。但是当我的TypeB视图的名称字段无效时我遇到了问题(我正在使用EntLib 5验证并实现了IDataErrorInfo - 所以我的绑定有ValidatesOnDataErrors = True)。虽然控件的错误模板按预期显示,但当我在树视图中单击TypeA时,即使TypeA的名称文本框有效,仍会显示错误消息。

就好像绑定混淆了哪个。奇怪的是它只发生一种方式,即从无效的TypeB名称转到TypeA视图。从无效的TypeA视图出发时似乎没有发生。

任何人都可以帮忙表明我做错了吗?

这是我用于文本框的错误模板;

<Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <DockPanel LastChildFill="true">
                            <Border DockPanel.Dock="Left" Margin="0,0,2,0" Width="14" Height="14" CornerRadius="10"
                                ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors), Converter={StaticResource ErrorContentConverter}}">
                                <Border.Background>
                                    <RadialGradientBrush GradientOrigin="0.2,0.2" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
                                        <RadialGradientBrush.GradientStops>
                                            <GradientStop Color="Pink" Offset="0" />
                                            <GradientStop Color="Red" Offset="1" />
                                        </RadialGradientBrush.GradientStops>
                                    </RadialGradientBrush>
                                </Border.Background>

                                <TextBlock Text="!" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" />
                            </Border>
                            <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center">
                                <Border BorderBrush="Red" BorderThickness="1" />
                            </AdornedElementPlaceholder>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

0 个答案:

没有答案