Stellvertretend für einen Validierungsfehler innerhalb einer Kontrolle, die nicht dem Datengebundenen Steuerelement ist?

StackOverflow https://stackoverflow.com/questions/4081550

Frage

habe ich eine TextBlock innerhalb eines DockPanel innerhalb eines Border. Die TextBlock datengebunden und kann mit einer On-Screen-Tastatur geändert werden. Deshalb habe ich es bis zur Validierung angeschlossen und es funktioniert wunderbar. Mein Dilemma ist, dass ich nur die TextBlock der scheint, die Art zu ändern, wenn es ein Fehler bei der Überprüfung ist. Ich möchte die Border Stil auszulösen. Wie kann ich das tun?

Auch ist es eine Möglichkeit, die ErrorContents an anderer Stelle auf der Ansicht zu binden?

War es hilfreich?

Lösung

binden Sie einfach zu Ihrem TextBox von einer anderen Steuerung. Unten gebunden ich ein Content-Eigenschaft des Etiketts an einem (Validation.Errors) des TextBox [0] .ErrorContent Eigenschaft.

<DockPanel>

    <!-- TextBox bound to a data object-->
    <TextBox Name="textBox1" DockPanel.Dock="Top" Text="{Binding Path=Age, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></TextBox>

    <!-- A label that displays the errors from textBox1 -->
    <Label Content="{Binding ElementName=textBox1, Path=(Validation.Errors)[0].ErrorContent}"></Label>

</DockPanel>

Andere Tipps

ich denke, das Ihr Problem lösen:

XAML:

<Window x:Class="WpfErrorsBorderColor.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfErrorsBorderColor="clr-namespace:WpfErrorsBorderColor" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style x:Key="{x:Type WpfErrorsBorderColor:MyControl}" TargetType="{x:Type WpfErrorsBorderColor:MyControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="WpfErrorsBorderColor:MyControl"  >
                    <Border Name="bd" >
                        <DockPanel LastChildFill="True"  >
                            <TextBox Text="{Binding Path=Description,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top"/>
                            <TextBlock Name="textBlock" Text="{Binding Path=Description,ValidatesOnDataErrors=True,NotifyOnValidationError=True}"></TextBlock>
                        </DockPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger SourceName="textBlock" Property="Validation.HasError" Value="True">
                            <Setter TargetName="bd" Property="BorderBrush" Value="Red" />
                            <Setter TargetName="bd" Property="BorderThickness" Value="4" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<WpfErrorsBorderColor:MyControl></WpfErrorsBorderColor:MyControl>

Code:

    using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;

namespace WpfErrorsBorderColor
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Data data = new Data() { Description = "123" };

            DataContext = data;
        }
    }

    public class Data : IDataErrorInfo, INotifyPropertyChanged
    {
        private string description;
        public string Description
        {
            get { return description; }
            set
            {
                if (description != value)
                {
                    description = value;

                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("Description"));
                }
            }
        }

        string CheckLenght(string str)
        {
            return (str.Length < 1 || str.Length > 10) ? "Strign must be between 1 and 10 letters" : String.Empty;
        }


        public string Error
        {
            get { return CheckLenght(Description); }
        }

        public string this[string columnName]
        {
            get { return CheckLenght(Description); }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }

    public class MyControl:UserControl
    {
        public MyControl()
        {

        }
    }
}

ErrorContents Sie können die gleiche Art und Weise binden;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top