2015-09-12 11 views
7

Sto sviluppando un'applicazione WPF e in una finestra ho utilizzato un componente della procedura guidata dal toolkit WPF. In questo mago sto creando una nuova persona. Nella seconda fase sto usando un'enumerazione come fonte per possibili tipi di contatto (ad esempio Telefono, Email ...).Convalida articoli in ItemsControl

Questa è la mia pagina della procedura guidata 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> 

La fonte di ItemsControl è un elenco di classe PersonContactModel:

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

la classe base implementare un'interfaccia IDataErrorInfo con la convalida informazioni sulla proprietà Contatto.

Il comportamento desiderato è che se la casella di controllo è selezionata, è visibile la griglia con un campo per l'immissione di un contatto, altrimenti no. Il pulsante il prossimo passo dovrebbe essere visto solo quando i tipi di contatto selezionati sono validi. Questa funzionalità sta cercando di realizzare i seguenti stili in app.xaml:

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

Purtroppo, il pulsante per il passo successivo è invisibile, anche se si chiede a tutti i tipi di contatto per la nuova persona e soddisferà tutte le condizioni per una voce valida

Cosa c'è che non va? Dov'è un errore?

risposta

7

Stai cercando di ottenere quello che vuoi in un modo non molto buono. L'errore in questo particolare codice è perché si fa riferimento all'elemento "txtContactValue" dal trigger di stile e lo stile non ha idea di cosa sia questo elemento. A proposito, se guardi la finestra di output durante il debug del tuo codice, scommetto che vedrai questo errore lì.

Ora, anche se si cercherà di fare riferimento a "txtContactValue" senza stile, in questo modo:

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

non funzionerà, perché txtContactValue è di portata diversa. MA non dovresti farlo in un primo momento! Hai un modello per i tuoi dati, e questo è il modello che controlla se i dati sono validi o meno. Basta aggiungere alcune proprietà al modello che indicano se i dati che si creano in questa pagina della procedura guidata sono validi (come PersonContact.IsValid) e si può passare alla pagina successiva e associare a questa proprietà.

+0

Questa è una buona idea ma non per il mio caso. Stavo cercando di creare un gruppo Binging e impostarlo sull'elemento textbox e sull'elemento casella di controllo ... La visibilità di NextButtonVisibility deve essere visibile solo se la casella di controllo è un segno di spunta e la casella di testo è valida per la convalida nel modello. Ad esempio: ho due elementi in ItemControlSource frist "gruppo" è compilato correttamente e il secondo ha la casella di spunta deseleziona e textbox epmty e tutto è valido. – Davecz

+0

Beh, almeno adesso sai dov'è l'errore nel tuo codice :) – Evk

+0

Mi dispiace, forse fraintendimenti, ma la domanda è stata posta sull'errore mentre descrivevo il comportamento: Il comportamento desiderato è che se la casella è spuntata , è una griglia visibile con un campo per inserire un contatto, altrimenti no. Il pulsante il prossimo passo dovrebbe essere visto solo quando i tipi di contatto selezionati sono validi. Questa funzionalità sta cercando di realizzare i seguenti stili in app.xaml. Ma creare una nuova proprietà da modellare è una buona idea :-) – Davecz

Problemi correlati