2010-12-10 3 views
0

Есть ли у кого-нибудь пример проверки перекрестной строки для WPF Datagrid. Проверка уровня ячеек и проверка правильности Rowlevel не соответствуют моим требованиям. Я стараюсь как можно больше придерживаться MVVM. мой последний вариант - использовать код позади. поэтому в основном мне нужно получить доступ к Itemssource, когда что-то происходит в сетке. Буду признателен за любую оказанную помощь. Thanks -ReyWPF Datagrid Cross row Validation

+0

вы используете Entity Framework? –

+0

yes и его приложение сервера клиентов ... – Manohar

ответ

1

по коду за добавлением частичного класса к каждой таблице.

Свойства [HasNoError] это возвращает истину, если нет ошибки

Свойства [Ошибка] является возвращать ошибки в виде строки

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

Я верю выше, работает для проверки уровня ячейки. для моей проверки multirow, я нашел этот пост, http://stackoverflow.com/questions/1729414/wpf-datagrid-how-to-validate-multiple-rows-and-mark-all-invalid-ones, а также я совмещаю ur проверка уровня ячейки для отображения недопустимых ячеек. извините, я не могу отметить ответ ур как ответ, так как он не дает правильного решения моей проблемы. – Manohar