2012-03-10 9 views
0

2つのデータグリッド列の間で検証依存関係を作成しようとしています。列間にデータグリッドの検証依存関係を作成するにはどうすればいいですか

最初の列はドロップダウンボックスです。 (DataGridTemplateColumn) 2番目はテキスト列です。 (DataGridTextColumn)

同じ行のDataGridテキスト列セルの検証を強制するために、コードのドロップダウンボックスイベントから試しています。

ありがとうございました。ここで

  <data:DataGridTemplateColumn Header="Type" > 
       <data:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding Source={StaticResource TypeListContainer}, Path=TypeLists}" Loaded="TypeBoxLoaded" DropDownClosed="TypeBoxChanged"> 
         </ComboBox> 
        </DataTemplate> 
       </data:DataGridTemplateColumn.CellTemplate> 
      </data:DataGridTemplateColumn> 
      <data:DataGridTextColumn Header="Rule" Binding="{Binding RuleWrapper, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" x:Name="RuleCol" /> 

プロパティ

public string RuleWrapper 
{ 
    get 
    { 
     return this.Rule; 
    } 
    set 
    { 
     //Required 
     if (value == null || value == string.Empty) 
     { 
      throw new ValidationException("Rule is required"); 
     } 
     //Match regular expression if type is channel 
     Regex reg = new Regex(@"^(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)$"); 
     if (Type == "channel" && !reg.IsMatch(value)) 
      throw new ValidationException("Channel not matching the right format"); 

     //Match range if type is trunk 
     int intValue = -1; 
     //Match if is a number 
     if (int.TryParse(value, out intValue)) 
     { 
      //Match if number is in the range 
      if (intValue < 0 || intValue > 134217727) 
       throw new ValidationException("Trunk value must be between 0 and 134317727"); 
     } 
     else 
      throw new ValidationException("Trunk value must a an integer"); 
     this.Rule = value; 
    } 
} 
+0

ComboBoxコントロールの目的は何ですか?選択した値も有効にする必要がありますか?あなたの例では、 'RuleWrapper = RuleWrapper'を呼び出すことによって検証を強制することができますが、それがあなたが必要とするものであるとは確信していません。 – vorrtex

+0

comboxボックスを選択すると、ルールに対して異なる検証がトリガーされます。だから私はRuleWrapper = RuleWrapperを実行してコード内の検証を強制すると、ValidationExceptionがスローされますが、データグリッド上で正しく表示されるように扱う方法がわかりません – Stainedart

+0

IDataErrorInfoを使用すると、 INotifyDataErrorInfoインターフェイス。これらのインターフェイスで実行されるようにこの検証を完全に書き直すとどう思いますか?その後、すべての検証コードを書き直す必要があります。 – vorrtex

答えて

2

は(私はまだ検証について学んだので、私は修正するスタンド)注意すべきいくつかのことです。

  • WPFはにValidationExceptionをサポートしていません。結合におけるValidatesOnExceptions =真設定

  • のみ( 数に文字列を変換するように)内部で使用されるデフォルトのコンバータで 例外を処理します。

  • あなた自身のコンバーターの例外がキャッチされず、 のアプリケーションがクラッシュする可能性があります。検証がIDataErrorInfoINotifyDataErrorInfo(SilverlightとWPF 4.5)ValidationRule

を使用して処理される

  • また、私は、現時点ではWPFの観点から答えています。私は後でSilverlightをテストします。

    MSDNにはここに驚くほど良い記事があります。binding and validationです。

    ここでは、2つのテキスト列間の検証の依存関係を示すサンプルを示します(簡略化のため)。 2番目の列は読み取り専用ですが、最初の列に起因する検証エラーが表示されます。

    <Grid> 
        <Grid.DataContext> 
         <Samples:DataGridValidationViewModels/> 
        </Grid.DataContext> 
    
        <DataGrid AutoGenerateColumns="False" ItemsSource={Binding Items}> 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="Column 1" Binding="{Binding Column1, ValidatesOnDataErrors=True}" /> 
          <DataGridTextColumn IsReadOnly="True" Header="Column 2" Binding="{Binding Column2, ValidatesOnDataErrors=True}" /> 
         </DataGrid.Columns> 
        </DataGrid> 
    </Grid> 
    

    私は私のビューモデル/ INotifyPropertyChangeサポートのためMVVMライトを使用して、その独自の実装(_prop =値でセット(()=> ...の私の使用を交換しています。RaisePropertyChanged( "文字列「);など)

    読み取り専用プロパティのプロパティ変更イベントを上げると、検証が有用である性質上発生する原因となることに注意してください

    public class DataGridValidationViewModels 
    { 
        public DataGridValidationViewModels() 
        { 
         Items = new ObservableCollection<DataGridValidationViewModel> 
            { 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
             new DataGridValidationViewModel(), 
            }; 
    
        } 
    
        public IEnumerable<DataGridValidationViewModel> Items { get; set; } 
    } 
    
    public class DataGridValidationViewModel : ViewModelBase, IDataErrorInfo 
    { 
        public DataGridValidationViewModel() 
        { 
         _column1 = "Column 1"; 
         _column2 = "Column 2"; 
        } 
    
        private string _column1; 
    
        public string Column1 
        { 
         get { return _column1; } 
         set 
         { 
          Set(() => Column1, ref _column1, value); 
          Column2 = value; 
         } 
        } 
    
        private string _column2; 
    
        public string Column2 
        { 
         get { return _column2; } 
         private set{ Set(()=>Column2, ref _column2, value);} 
        } 
    
        #region Implementation of IDataErrorInfo 
    
        public string this[string columnName] 
        { 
         get 
         { 
          switch (columnName) 
          { 
           case "Column1": 
            return Column1 == "Error" ? "There's an error in column 1!" : string.Empty; 
    
           case "Column2": 
            return Column1 == "Error" ? "There's an error in column 2!" : string.Empty; 
          } 
    
          return string.Empty; 
         } 
        } 
    
        public string Error 
        { 
         get { return string.Empty; } 
        } 
    
        #endregion 
    } 
    

    あなたが列1のテキストに変更し

    。 "エラー"あなたは得る:

    enter image description here

  • +0

    この記事の記事http://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples#exceptionには、DataGridの検証に関する有用な情報があります。 ValidationExceptionが機能しないという私の主張をチェックしなければならないかもしれません:) – Phil

    +0

    あなたにお答えいただきありがとうございますPhil私があなたが提供したリンクを読んでいます。 – Stainedart

    +0

    Hey Phil、私はあなたのアドバイスに続き、INotifyDataErrorInfoインターフェイスを実装しましたが、まだ問題が発生しています。http://stackoverflow.com/questions/9670118/inotifydataerrorinfo-not-raising-error-changed-in-code-behind – Stainedart

    関連する問題