2013-11-07 3 views
2

Я пытаюсь научиться реализовывать проверку данных, но моя первая попытка не запускает событие lblSource_Error; кто-нибудь знает, что я пропустил? XAMLМой первый C# WPF ValidationRule не стреляет

моего окна: Код

<Window x:Class="cCompleteWPFResourcesExamples.wValidationRule" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:cCompleteWPFResourcesExamples" 
    Title="wValidationRule" Height="300" Width="300"> 
<Window.Resources> 
    <local:Customer x:Key="rCustomer" Forename="InXaml" Surname="Created" ID="1"  
AmountOutstanding="0"/> 
</Window.Resources> 
<StackPanel x:Name="stkMain" DataContext="{StaticResource rCustomer}"> 
    <Label x:Name="lblSource" Validation.Error="lblSource_Error"> 
     <Label.Content> 
      <Binding Path="ID" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <local:cIDValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </Label.Content> 
    </Label> 
    <Label x:Name="lblErrorMessage" Content="No Error Yet"/> 
</StackPanel> 
</Window> 

моего окна:

namespace cCompleteWPFResourcesExamples 
    { 
    /// <summary> 
    /// Interaction logic for wValidationRule.xaml 
    /// </summary> 
    public partial class wValidationRule : Window 
    { 
     Customer cus = new Customer(); 

     public wValidationRule() 
     { 
      InitializeComponent(); 
      cus.ID = 0; 
      stkMain.DataContext = cus; 
     } 


     private void lblSource_Error(object sender, ValidationErrorEventArgs e) 
     { 
      lblErrorMessage.Content = e.Error.ErrorContent.ToString(); 
     } 
    } 
    } 

Мой ValidationRule:

using System.Windows.Controls; 

namespace cCompleteWPFResourcesExamples 
{ 
public class cIDValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, 
System.Globalization.CultureInfo cultureInfo) 
    { 
     int iValue = (int)value; 
     if (iValue == 0) return new ValidationResult(false, "No ID number"); 

     return new ValidationResult(true, null); 
    } 
} 
} 

Объект клиента очень прост: всего несколько свойств.

Спасибо!

Джеймс

+0

Этикетка? Ярлыки не являются входами, поэтому я не думаю, что для них будет работать проверка ... – Will

+0

Поле id вашего пользовательского объекта можно отредактировать на форме или просто показать? Правило проверки будет проверено при изменении значения –

ответ

1

Awww такое печальное название :) :) Первый МОФ ValidationRule не делать то, что вы хотите.

Механизм привязки проверяет каждый ValidationRule, связанный с привязкой каждый раз, когда входное значение (значение свойства привязки привязки) переносится в свойство источника привязки.

Помните:

Вы что-то типа и значение в настоящее время сохраняется на источник => ValidationRule будет срабатывать.

Вы хотите показать что-то в ярлыке, и значение передается из источника в Label => ValidationRule никогда не будет срабатывать.

Если вы хотите, чтобы ваш пример работал, тогда вместо этого выберите TextBox и установите режим привязки на TwoWay, чтобы вы могли ввести что-то, и привязка будет сохраняться в типичном значении источника, вызывающего срабатывание ValidationRule. :)

+0

Спасибо: оба ответа велики, но я использовал это, чтобы получить от меня большую часть пути (потому что он был первым!): Сменить метки на текстовые поля, установить режим привязки = twoway, но я также необходимо реализовать INotifyPropertyChanged в классе Customer, а в cIDValidationRule - значение unbox для строки, затем int. –

+0

@ jamespearce вам не нужно менять ярлыки на текстовые поля. см. мое обновление –

+0

Исправить. У вас есть это :) Простейший способ продемонстрировать, как это работает, использовать TextBox и набирать что-то смешное внутри hehehehe –

0

я должен был сделать это, чтобы заставить его работать для меня, который я получил от this site

<Binding Path="ID" 
NotifyOnValidationError="True" 
ValidatesOnDataErrors="true" 
ValidatesOnExceptions="True" 
UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"> 

надеюсь, что это помогает, также следить, как object, который пропускается через валидации был string в мой случай не int

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
{ 
    if (value is int) 
    { 
     int iValue = (int)value; 
     if (iValue == 0) 
     { 
      return new ValidationResult(false, "No ID number"); 
     } 

     return new ValidationResult(true, null); 
    } 
    else if (value is string) 
    { 
     string strValue = (string)value; 
     if (String.IsNullOrEmpty(strValue) || strValue == "0") 
     { 
      return new ValidationResult(false, "No ID number"); 
     } 
    } 

    return new ValidationResult(true, null); 
} 

* Обновление **

Я забыл, что я также должен был добавить это для его запуска.

public wValidationRule() 
{ 
    InitializeComponent(); 
    cus.ID = 0; 
    stkMain.DataContext = cus; 

    //trigger the validation. 
    lblSource.GetBindingExpression(Label.ContentProperty).UpdateSource(); 
} 
Смежные вопросы