2015-09-12 16 views
7

Ich entwickle eine WPF-Anwendung und in einem Fenster habe ich eine Assistentenkomponente aus WPF-Toolkit verwendet. In diesem Assistenten erstelle ich eine neue Person. Im zweiten Schritt verwende ich eine Aufzählung als Quelle für mögliche Kontakttypen (zB Telefon, Email ...).Validieren von Elementen in ItemsControl

Dies ist meine Seite des Assistenten in XAML:

<xctk:WizardPage x:Name="NewContactPage" PageType="Interior" 
       Title="Contacts" Style="{DynamicResource NewContactPage}" 
       CanCancel="True" CanFinish="False" 
       Loaded="NewContactPage_Loaded" 
       PreviousPage="{Binding ElementName=NewPersonPage}"> 
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Top"> 
     <control:DataLoader x:Name="ctrNewContactLoader" /> 
     <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Top" Orientation="Vertical"> 
      <ItemsControl ItemsSource="{Binding Path=Person.PersonContacts, Mode=TwoWay, 
                  RelativeSource={RelativeSource Mode=FindAncestor, 
                          AncestorType=Window}}" 
             Name="icContacts"> 
       <ItemsControl.ItemTemplate> 
        <ItemContainerTemplate> 
         <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Top" Orientation="Vertical" 


         Margin="5" Background="WhiteSmoke"> 
         <CheckBox IsChecked="{Binding Path=IsValid}" 
               Content="{Binding Path=ContactType.Description}" 
               Name="cbContactVisible"/> 

         <Grid HorizontalAlignment="Stretch" VerticalAlignment="Top" 
              Visibility="{Binding ElementName=cbContactVisible, Path=IsChecked, 
                   Converter={StaticResource BooleanToVisibilityConverter}}"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="auto" /> 
          </Grid.RowDefinitions> 

          <TextBox Grid.Row="0" Grid.Column="0" 
               HorizontalAlignment="Stretch" MaxLength="64" 
               Name="txtContactValue" 
               Text="{Binding Path=Contact, 
                 ValidatesOnDataErrors=True, 
                 ValidatesOnNotifyDataErrors=True, 
                 ValidatesOnExceptions=True}" /> 
         </Grid> 
        </StackPanel> 
       </ItemContainerTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </StackPanel> 
</Grid> 

Die Quelle von Itemscontrol ist eine Liste der PersonContactModel Klasse:

public class PersonContactModel : BaseObjectModel 
{ 
    public PersonContactModel() 
    { 
     this.Created = DateTime.Now; 
     this.Updated = DateTime.Now; 

     this.IsValid = true; 

     this.ContactType = new ContactTypeModel(); 
    } 

    public string Contact { get; set; } 
    public ContactTypeModel ContactType { get; set; } 
    public DateTime Created { get; set; } 

    public int Id { get; set; } 
    public bool IsValid { get; set; } 
    public DateTime Updated { get; set; } 

    public override string this[string columnName] 
    { 
     get 
     { 
      string retVal = string.Empty; 
      switch (columnName) 
      { 
       case "Contact": 
        retVal = base.Concat(base.RequeiredField(this.Contact), base.MinLength(this.Contact, 5), base.MaxLength(this.Contact, 62)); 
        break; 
      } 

      return retVal; 
     } 
    } 
} 

die Basisklasse eine IDataErrorInfo Schnittstelle mit Validierung implementieren Info über Kontakt-Eigenschaft.

Das gewünschte Verhalten ist, dass wenn das Kontrollkästchen aktiviert ist, ist es sichtbar Gitter mit einem Feld für die Eingabe eines Kontakts, sonst nicht. Der nächste Schritt der Schaltfläche sollte nur angezeigt werden, wenn die ausgewählten Kontakttypen gültig sind. Diese Funktionalität wird versucht, die folgenden Stile in app.xaml zu erreichen: für den nächsten Schritt

<Style TargetType="xctk:WizardPage" x:Key="NewContactPage"> 
    <Setter Property="NextButtonVisibility" Value="Hidden" /> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding Path=(Validation.HasError), ElementName=txtContactValue}" Value="False" /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="NextButtonVisibility" Value="Visible" /> 
     </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 

Leider ist die Schaltfläche nicht sichtbar ist, auch wenn es alle Arten von Kontakt für die neue Person fragt und alle Bedingungen erfüllen für einen gültigen Eintrag.

Was ist los? Wo ist ein Fehler?

Antwort

7

Sie versuchen, auf eine nicht sehr gute Weise zu erreichen, was Sie wollen. Fehler in diesem bestimmten Code ist, weil Sie das Element "txtContactValue" von Ihrem Stil-Trigger verweisen, und Stil hat keine Ahnung, was dieses Element ist. Übrigens, wenn Sie beim Debuggen Ihres Codes das Ausgabefenster betrachten, wette ich, dass Sie diesen Fehler dort sehen werden.

Nun, auch wenn Sie versuchen, „txtContactValue“ ohne Stil zu verweisen, wie folgt aus:

NextButtonVisibility="{Binding ElementName=txtContactValue, Path=(Validation.HasError), Converter={StaticResource BooleanToVisibilitConverter}}" 

Es wird nicht funktionieren, weil txtContactValue in anderen Bereich ist. ABER du solltest das nicht an erster Stelle tun! Sie haben ein Modell für Ihre Daten, und das ist ein Modell, das steuert, ob Daten gültig sind oder nicht. Fügen Sie Ihrem Modell einfach eine Eigenschaft hinzu, die angibt, ob Daten, die Sie auf dieser Seite des Assistenten erstellen, gültig sind (wie PersonContact.IsValid) und Sie können mit der nächsten Seite fortfahren und sich an diese Eigenschaft binden.

+0

Das ist eine gute Idee, aber nicht für meinen Fall. Ich habe versucht, eine BingingGroup zu erstellen und es auf Textboxelement und Kontrollkästchenelement zu setzen ... Die Sichtbarkeit von NextButtonVisibility muss nur sichtbar sein, wenn das Kontrollkästchen aktiviert ist und das Textfeld durch die Validierung im Modell gültig ist. Zum Beispiel: Ich habe zwei Elemente in ItemControlSource erste "Gruppe" ist korrekt gefüllt und die zweite hat Kontrollkästchen deaktivieren und Textbox EPMTY und alle ist gültig. – Davecz

+0

Nun zumindest wissen Sie jetzt, wo ist der Fehler in Ihrem Code :) – Evk

+0

Es tut mir leid, vielleicht Missverständnis, aber die Frage wurde auf den Fehler während beschrieben das Verhalten: Das gewünschte Verhalten ist, dass, wenn das Kontrollkästchen aktiviert ist Es ist ein sichtbares Gitter mit einem Feld zum Eingeben eines Kontakts, andernfalls nicht. Der nächste Schritt der Schaltfläche sollte nur angezeigt werden, wenn die ausgewählten Kontakttypen gültig sind. Diese Funktion versucht, die folgenden Stile in app.xaml zu erreichen. Aber neue Eigenschaft zu modellieren ist eine gute Idee :-) – Davecz

Verwandte Themen