私はWPFアプリケーションを開発しています.1つのウィンドウで、WPFツールキットのウィザードコンポーネントを使用しました。このウィザードで私は新しい人を創造しています。 2番目のステップでは、可能な連絡先タイプのソースとして列挙を使用しています(電話、電子メールなど)。ItemsControlの項目の妥当性チェック
これは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>
のItemsControlのソースは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;
}
}
}
基底クラスは、検証とIDataErrorInfoインターフェイスを実装Contactプロパティに関する情報
このチェックボックスをオンにすると、連絡先を入力するためのフィールドが表示され、それ以外の場合は表示されません。ボタンの次のステップは、選択したコンタクトタイプが有効な場合にのみ表示されます。この機能は、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>
は残念ながら、次のステップのためのボタンが、それは新しい人のための接触のすべての種類を尋ねていても、目に見えないで、すべての条件を満たします有効な入力のために。
どういうところが間違っていますか?エラーはどこですか?
これは良い考えですが、私の場合はそうではありません。私はBingingGroupを作成し、それをテキストボックス要素とチェックボックス要素に設定しようとしていました... NextButtonVisibilityの可視性は、チェックボックスがチェックされ、テキストボックスがモデルの検証によって有効である場合にのみ表示される必要があります。 例:ItemControlSourceの2つの項目「グループ」が正しく入力され、2番目の項目にチェックボックスがオフになっていて、テキストボックスのepmtyがすべて有効です。 – Davecz
少なくとも、あなたのコードのどこにエラーがあるのか分かります:) – Evk
ご迷惑をおかけして申し訳ございませんが、問題の説明にエラーメッセージが表示されました: チェックボックスがオンの場合連絡先に入力するためのフィールドが表示されたグリッドです。それ以外の場合は表示されません。ボタンの次のステップは、選択したコンタクトタイプが有効な場合にのみ表示されます。この機能は、app.xamlで次のスタイルを達成しようとしています。 モデルに新しいプロパティを作成することは良いアイデアです:-) – Davecz