3

TextBlock内に内DockPanelがありますBorder。はTextBlockデータバインドされており、オンスクリーンキーボードで変更できます。したがって、私はそれを検証に接続しました、そしてそれは素晴らしく機能します。私のジレンマはTextBlock、検証エラーが発生した場合にのみ、のスタイルを変更できるように見えることです。Borderのスタイルをトリガーしたい。これどうやってするの?

ErrorContentsまた、ビューの他の場所をバインドする方法はありますか?

4

2 に答える 2

3

他のコントロールからTextBoxにバインドするだけです。以下では、LabelのContentプロパティをTextBoxの(Validation.Errors)[0].ErrorContentプロパティにバインドしました。

<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>
于 2010-11-02T20:55:14.017 に答える
1

私はこれがあなたの問題を解決すると思います:

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>

コード:

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

于 2010-11-02T20:48:02.630 に答える