2015-09-12 18 views
7

Bir WPF uygulaması geliştiriyorum ve bir pencerede WPF araç setinden bir sihirbaz bileşeni kullandım. Bu sihirbazda yeni bir insan oluyorum. İkinci adımda, olası iletişim türleri için bir kaynak olarak numaralandırma kullanıyorum (örneğin Telefon, E-posta ...).Öğeleri doğrulamak ItemsControl

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

temel sınıf Doğrulama ile ilgili bir IDataErrorInfo arabirimini uygulamak: ItemsControl kaynak PersonContactModel sınıfının bir listesi

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

geçerli:

Bu XAML benim sihirbaz sayfası İletişim özelliği hakkında bilgi.

İstenilen davranış, onay kutusu işaretliyse, bir kişi girmek için alan içeren görünür bir kılavuzdur, aksi halde değil. Düğme bir sonraki adım sadece seçilen iletişim türleri geçerli olduğunda görülmelidir. Bu işlevsellik app.xaml aşağıdaki stilleri gerçekleştirmek için çalışıyor:

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

Maalesef sonraki adım için düğmeye yeni kişi için temas her türlü sorar ve tüm koşulları yerine getirecek olsa bile, görünmez geçerli bir giriş için.

Neyin var? Bir hata nerede?

cevap

7

Ne istediğinizi çok iyi bir şekilde elde etmeye çalışıyorsunuz. Bu belirli koddaki hata, stil tetikleyicinizden "txtContactValue" öğesine başvuru yaptığınız ve stilin bu öğenin ne olduğu konusunda hiçbir fikri olmadığı içindir. Bu arada, kodunuzda hata ayıklama yaparken çıkış penceresine bakarsanız, bu hatayı orada göreceğinize eminim.

Şimdi, böyle, stil olmadan "txtContactValue" başvurmak için çalışacağız bile: txtContactValue farklı kapsamda olduğu için

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

Bu çalışmayacaktır. ANCAK bunu ilk etapta yapmamalısınız! Verileriniz için bir modeliniz var ve bu, verilerin geçerli olup olmadığını kontrol eden modeldir. Sadece, bu sihirbaz sayfasında oluşturduğunuz verilerin geçerli olduğunu (PersonContact.IsValid gibi) gösterip göstermediğini ve bir sonraki sayfaya geçip bu özelliğe bağlayabileceğinizi gösteren modelinize bazı özellikler ekleyin.

+0

Bu iyi bir fikir ama benim durumum için değil. Bir BingingGroup yaratmaya çalışıyordum ve bunu textbox öğesine ve onay kutusu öğesine ayarlamaya çalışıyordum. NextButtonVisibility görünürlüğü, yalnızca onay kutusu işaretliyse ve modelde doğrulama tarafından bir metin kutusu geçerliyse görünmelidir. Örneğin: ItemControlSource frist "group" öğesinde iki öğenin doğru şekilde doldurulduğunu ve ikincisi onay kutusunun işaretini kaldırdıktan sonra textbox epmty öğesinin ve tümünün geçerli olduğunu unutmayın. – Davecz

+0

En azından şu anda kodunuzdaki hatanın nerede olduğunu biliyorsunuz :) – Evk

+0

Üzgünüm, belki yanlış anlaşılıyor, fakat davranış şu şekilde tanımlanırken hatayla ilgili soru soruldu: İstenilen davranış, onay kutusu işaretliyse Bu, bir kişi girmek için bir alan ile görünür ızgara, aksi takdirde değil. Düğme bir sonraki adım sadece seçilen iletişim türleri geçerli olduğunda görülmelidir. Bu işlevsellik, app.xaml dosyasında aşağıdaki stilleri gerçekleştirmeye çalışıyor. Ancak modele yeni özellik oluşturmanın iyi bir fikir olduğunu :-) – Davecz

İlgili konular