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?
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
Nun zumindest wissen Sie jetzt, wo ist der Fehler in Ihrem Code :) – Evk
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