تمثل خطأ التحقق من الصحة داخل عنصر تحكم ليس من عنصر التحكم المرتبط بالبيانات؟
-
28-09-2019 - |
سؤال
انا املك 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()
{
}
}
}
خطأ يمكنك ربط بنفس الطريقة ؛)
لا تنتمي إلى StackOverflow