2010-12-10 107 views
0

有沒有人有WPF Datagrid交叉行驗證的任何示例。單元級別驗證和Rowlevel驗證不符合我的要求。我儘可能地堅持使用MVVM。我的最後一個選擇是使用後面的代碼。所以基本上我需要在網格中發生某些事情時訪問Itemssource。任何幫助深表感謝。 感謝-ReyWPF Datagrid跨行驗證

+0

您使用實體框架? – 2010-12-10 22:04:44

+0

是的,它的一個客戶端服務器應用程序... – Manohar 2010-12-10 22:16:15

回答

1

關於後面的代碼在每個表中添加一個部分類。

酒店[HasNoError]是返回true,如果沒有錯誤

酒店[錯誤]是字符串

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

返回錯誤在XAML端使用綁定

<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 2010-12-21 04:37:09