1

我正在开发 wpf 应用程序。我对 wpf 很陌生。我使用“标题内容控件”,标签作为标题,文本框作为内容部分。没问题。对于验证,我使用的是“IDataErrorInfo”。我能够显示错误,但我的问题是

i) 在完整的 Headered Contentcontrol 上显示错误边框(在标签和 Tet 框上),如何仅在 TextBox 上显示红色边框...

ii)当我将光标放在边框上时,我能够显示错误消息(如图所示),但是当我将光标放在文本框上时无法显示错误消息.....任何人都可以帮助我怎么做我更改了样式,以便可以在文本框工具提示上显示错误消息...

这是我显示错误消息的样式...

<Style TargetType="HeaderedContentControl">
        <Style.Setters>
<Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <!--<Border BorderBrush="Red" 
                                BorderThickness="1" 
                                ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                            <AdornedElementPlaceholder Name="customAdorner" />
                        </Border>-->
                        <AdornedElementPlaceholder Name="customAdorner" 
                                                   VerticalAlignment="Center" 
                                                   ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                            <Border BorderBrush="red" 
                                    BorderThickness="1">                                
                            </Border> 
                        </AdornedElementPlaceholder>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
 </Style.Setters>
    </Style>

在此处输入图像描述

提前致谢

我的标题内容控制代码是:

 <HeaderedContentControl Header="Name" 
   Content="{Binding Path=ValidationClassProp.Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>

验证类继承 IDataErrorInfo 的位置...

4

2 回答 2

0

您面临的问题是由于您将内容属性绑定HeaderedContentControl到模型中的属性。在这种情况下,整体HeaderedContentControl 被认为是错误的

所以可能的解决方案是显式指定控件的内容HeaderedContentControl并绑定到控件的Text属性TextBox

<HeaderedContentControl Header="Name">
    <TextBox Text="{Binding Path=ValidationClassProp.Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
</HeaderedContentControl>

并以样式应用您的错误模板TextBox

编辑

有一个粗略的想法来尝试保留您当前的 xaml。您可以尝试创建IValueConveter将其AdornedElementPlaceholder作为值,将其转换为HeaderedContentControl并尝试获取此控件的内容部分的实际大小和位置,然后准备一个Thinkness结构并将其作为结果返回。那Thinkness将是Margin你的红色边框所以它应该是这样的:

<AdornedElementPlaceholder Name="customAdorner" 
    VerticalAlignment="Center"
    ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                        <Border BorderBrush="red"
                                Margin={Binding ElementName=customAdorner, Converter={StaticResource SomeCustomConverter}"
                                BorderThickness="1">                             
                        </Border> 
                    </AdornedElementPlaceholder>

同样,这不是完整的解决方案,而是一个可能的方向,因为获得内容部分的位置仍然不是那么容易......

于 2013-02-21T15:23:04.673 回答
0

由于验证错误模板设置为显示在整个控件上,因此您只需调整数据模板上的绑定,以便验证错误模板显示在模板内的 TextBlock 上,而不是整个 HeaderedContentControl。

我构建了一个小应用程序来演示这一点。这是代码:

窗口的 XAML

<Window x:Class="_15001777.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:_15001777"
        Title="MainWindow"
        Width="525"
        Height="350">
    <Grid>
        <ItemsControl ItemsSource="{Binding Path=Items}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type local:HeaderedItem}">
                    <HeaderedContentControl Header="{Binding Path=Header}">
                        <HeaderedContentControl.HeaderTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Label VerticalAlignment="Center"
                                           HorizontalContentAlignment="Right"
                                           Content="Name" />
                                    <TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=HeaderedContentControl}, Path=DataContext.Header, ValidatesOnDataErrors=True}" />
                                </StackPanel>
                            </DataTemplate>
                        </HeaderedContentControl.HeaderTemplate>
                    </HeaderedContentControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

窗口的代码隐藏

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace _15001777
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Items = new ObservableCollection<object>();
            Items.Add(new HeaderedItem { Header = "One" });
        }

        public ObservableCollection<object> Items { get; private set; } 
    }

    public class HeaderedItem : IDataErrorInfo
    {
        public object Header { get; set; }

        public string this[string columnName]
        {
            get { return columnName == "Header" ? "There was an error!" : null; }
        }

        public string Error { get; private set; }
    }
}
于 2013-02-21T14:08:55.050 回答