2012-06-13 3 views
1

У меня есть редактируемая сетка, которая привязывается к коллекции GridRow (пользовательский класс, описанные строки для сетки). GridRow имеет свойство Parameter(int), которое должно быть отредактировано пользователем. Простая проверка достоверности: я не могу вставить в это поле что-то вроде «текста» или чего-то еще. Но мне нужна проверка на всей сетке. В столбце Parameter на сетке может быть только один символ '1', два '2', три '3', два '5'. Так, например, если я уже вставляю в значения сетки «1,2,3», и я пытаюсь вставить «1», приложение должно показать мне подтверждение. Я пытаюсь сделать это с помощью IDataErrorInfo, но я не могу попасть в сеттерную таблицу целиком.Проверка сетки WPF

ответ

1

Я исправил свою проблему с подпиской на мероприятие CellVaildate.

1

Возможно, вам будет интересна статья в блоге, которую я имею о validating business rules in MVVM?

Это позволяет прикрепить код проверки модели из ViewModel и позволить вам выполнить то, что вы пытаетесь сделать.

public class GridViewModel 
{ 
    // Kept this generic to reduce code here, but it 
    // should be a full property with PropertyChange notification 
    public ObservableCollection<GridRowModel> GridRows{ get; set; } 

    public UsersViewModel() 
    { 
     GridRows = GetGridRows(); 

     // Add the validation delegate to the UserModels 
     foreach(var row in GridRows) 
      user.AddValidationErrorDelegate(ValidateGridRow); 
    } 

    // User Validation Delegate to verify UserName is unique 
    private string ValidateGridRow(object sender, string propertyName) 
    { 
     if (propertyName == "Parameter") 
     { 
      var row = (GridRow)sender; 
      var existingCount = GridRows.Count(p => 
       p.Parameter == row.Parameter && p != row); 

      switch(row.Parameter) 
      { 
       case 1: 
        if (existingCount >= 0) 
         return string.Format("{0}s are already taken", row.Parameter); 
       case 2: case 5: 
        if (existingCount >= 1) 
         return string.Format("{0}s are already taken", row.Parameter); 
       case 3: 
        if (existingCount >= 2) 
         return string.Format("{0}s are already taken", row.Parameter); 
      } 
     } 
     return null; 
    } 
} 
Смежные вопросы