2015-09-12 14 views
7

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

は残念ながら、次のステップのためのボタンが、それは新しい人のための接触のすべての種類を尋ねていても、目に見えないで、すべての条件を満たします有効な入力のために。

どういうところが間違っていますか?エラーはどこですか?

答えて

7

あなたは非常に良い方法であなたが望むことを達成しようとしています。この特定のコードのエラーは、あなたのスタイルトリガーから要素 "txtContactValue"を参照するので、スタイルはこの要素が何であるか全く分かりません。ところで、コードをデバッグするときに出力ウィンドウを見ると、このエラーが表示されます。

さて、あなたはこのように、スタイルなし「txtContactValue」を参照しようとする場合でも:txtContactValueは異なるスコープにあるので

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

それは、動作しません。しかし、これを最初にやってはいけません!あなたはあなたのデータのためのモデルを持っています、そしてそれはデータが有効かどうかを制御するモデルです。このウィザードページで作成するデータが有効かどうか(PersonContact.IsValidなど)を示し、次のページに進み、このプロパティにバインドできるかどうかを示すプロパティをモデルに追加するだけです。

+0

これは良い考えですが、私の場合はそうではありません。私はBingingGroupを作成し、それをテキストボックス要素とチェックボックス要素に設定しようとしていました... NextButtonVisibilityの可視性は、チェックボックスがチェックされ、テキストボックスがモデルの検証によって有効である場合にのみ表示される必要があります。 例:ItemControlSourceの2つの項目「グループ」が正しく入力され、2番目の項目にチェックボックスがオフになっていて、テキストボックスのepmtyがすべて有効です。 – Davecz

+0

少なくとも、あなたのコードのどこにエラーがあるのか​​分かります:) – Evk

+0

ご迷惑をおかけして申し訳ございませんが、問題の説明にエラーメッセージが表示されました: チェックボックスがオンの場合連絡先に入力するためのフィールドが表示されたグリッドです。それ以外の場合は表示されません。ボタンの次のステップは、選択したコンタクトタイプが有効な場合にのみ表示されます。この機能は、app.xamlで次のスタイルを達成しようとしています。 モデルに新しいプロパティを作成することは良いアイデアです:-) – Davecz

関連する問題