Pergunta

I have a TextBlock within a DockPanel within a Border. The TextBlock is data-bound and can be changed with an on-screen keyboard. Therefore, I have hooked it up to validation and it works wonderfully. My dilemma is that I can only seem to change the TextBlock's style when there is a validation error. I want to trigger the Border's style. How can I do this?

Also is there a way to bind the ErrorContents elsewhere on the view?

Foi útil?

Solução

Just bind to your TextBox from some other control. Below I bound a Label's Content property to a TextBox's (Validation.Errors)[0].ErrorContent property.

<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>

Outras dicas

I think this will solve your problem:

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 you can bind the same way ;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top