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?
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
Beh, almeno adesso sai dov'è l'errore nel tuo codice :) – Evk
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