我正在开发一个
WPF应用程序,在一个窗口中我使用了WPF工具包中的向导组件.在这个向导中,我正在创建一个新人.在第二步中,我使用枚举作为可能的联系类型的来源(例如电话,电子邮件……).
这是我在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类的List:
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>
不幸的是,下一步的按钮是不可见的,即使它要求新人的各种联系并且将满足有效输入的所有条件.
怎么了?哪里出错?
解决方法
你试图以一种不太好的方式实现你想要的东西.此特定代码中的错误是因为您从样式触发器引用元素“txtContactValue”,并且样式根本不知道该元素是什么.顺便说一句,如果你在调试代码时查看输出窗口,我打赌你会在那里看到这个错误.
现在,即使您将尝试引用没有样式的“txtContactValue”,如下所示:
NextButtonVisibility="{Binding ElementName=txtContactValue,Path=(Validation.HasError),Converter={StaticResource BooleanToVisibilitConverter}}"
它不起作用,因为txtContactValue在不同的范围内.但是你不应该在第一时间这样做!您有一个数据模型,这是控制数据是否有效的模型.只需在模型中添加一些属性,指示您在此向导页面上创建的数据是否有效(如PersonContact.IsValid),然后您可以继续下一页,并绑定到此属性.