2010-12-10 14 views
0

WPF Datagridのクロスローの検証には誰もいませんか?セルレベルの検証とRowlevel検証は私の要件を満たしていません。私は可能な限りMVVMに固執しようとしています。私の最後の選択肢は、コードを使用することです。だから、基本的に私はグリッド内で何かが起きたときにItemSourceにアクセスする必要があります。どんな助けでも大歓迎です。 ありがとう-ReyWPF Datagridクロスローのバリデーション

+0

を参照してくださいエラーテンプレートをターゲットに、いくつかのスタイルを追加作成するには、あなたは、Entity Frameworkのを使用していますか? –

+0

はいとそのクライアントサーバーのアプリケーション... – Manohar

答えて

1

コードの後ろに、各テーブルに部分クラスを追加します。

プロパティ[エラー]使用XAML側の列

if(tablename.HasNoError) 
{ 
// do your logic 
} 
else 
{ 
// display tablename.Error 
} 

としてエラーを返しているエラーがない場合

プロパティ[HasNoError]がtrueを返している結合

<DataGridTextColumn Binding="{Binding Path=ActualFieldName1, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged }" Header=" ActualFieldName1" /> 

これはIDataErrorInfo-

を使用したクラスサンプルです。
public partial class tablename : IDataErrorInfo 
{ 
    private Dictionary<string, string> errorCollection = new Dictionary<string, string>(); 
    public bool HasNoError 
    { 
     get 
     { 
      return string.IsNullOrWhiteSpace(Error); 
     } 
    } 
    public string Error 
    { 
     get 
     { 
      if (errorCollection.Count == 0) 
       return null; 
      StringBuilder errorList = new StringBuilder(); 
      var errorMessages = errorCollection.Values.GetEnumerator(); 
      while (errorMessages.MoveNext()) 
       errorList.AppendLine(errorMessages.Current); 
      return errorList.ToString(); 
     } 
    } 
    public string this[string fieldName] 
    { 
     get 
     { 
      string result = null; 
      switch (fieldName) 
      { 
       case "ActualFieldName1": 
        if (string.IsNullOrWhiteSpace(this.ActualFieldName1)) 
        { 
         result = "ActualFieldName1 is required."; 
        }; 
        if (Other_Condition) 
        { 
         result = "Other Result"; 
        }; 
        break; 
       case "ActualFieldName2": 
        if (string.IsNullOrWhiteSpace(this.ActualFieldName2)) 
        { 
         result = "ActualFieldName2 is required."; 
        }; 
        if (Other_Condition) 
        { 
         result = "Other Result"; 
        }; 
        break; 
        // and so 
      } 
      if (result != null && !errorCollection.ContainsKey(fieldName)) 
       errorCollection.Add(fieldName, result); 
      if (result == null && errorCollection.ContainsKey(fieldName)) 
       errorCollection.Remove(fieldName); 
      return result; 
     } 
    } 
} 

それは素敵な一例に

<Style TargetType="{x:Type TextBox}"> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border BorderBrush="Red" BorderThickness="1"> 
         <Grid> 
          <AdornedElementPlaceholder x:Name="MyAdorner"/> 
          <Image Width="{Binding AdornedElement.ActualHeight, ElementName=MyAdorner}" Margin="0" ToolTip="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=MyAdorner}" HorizontalAlignment="Right" VerticalAlignment="Center" Source="/Path/Exclamation.png" /> 
         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

私は上記のセルレベルの検証のために働くと信じています。私の複数の検証のために、私はこの記事を見つけた、http://stackoverflow.com/questions/1729414/wpf-datagrid-how-to-validate-multiple-rows-and-mark-all-invalid-onesそしてまた私はウル無効なセルを表示するセルレベルの検証。申し訳ありませんが私の問題に正しい解決策を与えていないので、私は答えとして返信することはできません。 – Manohar