تمثل خطأ التحقق من الصحة داخل عنصر تحكم ليس من عنصر التحكم المرتبط بالبيانات؟

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

سؤال

انا املك TextBlock داخل أ DockPanel داخل أ Border. ال TextBlock هو مرتبط بالبيانات ويمكن تغييره باستخدام لوحة مفاتيح على الشاشة. لذلك ، قمت بتوصيله بالتحقق من الصحة ويعمل بشكل رائع. معضلي هي أنه لا يمكنني إلا أن أغير TextBlockنمط عندما يكون هناك خطأ في التحقق من الصحة. اريد تشغيل Borderأسلوب. كيف يمكنني أن أفعل هذا؟

أيضا هل هناك طريقة لربط ErrorContents في مكان آخر على المنظر؟

هل كانت مفيدة؟

المحلول

فقط اربط مربع النص الخاص بك من عنصر تحكم آخر. فيما يلي ربط خاصية محتوى التسمية إلى مربع النص (التحقق من الصحة) [0].

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

نصائح أخرى

أعتقد أن هذا سيحل مشكلتك:

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()
        {

        }
    }
}

خطأ يمكنك ربط بنفس الطريقة ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top