2012-02-21 3 views
1

Используя приведенный ниже код, я могу заблокировать недопустимую запись ячейки. В этом простом примере списка покупок для бакалеи необходимо заполнить номер GroceryItem.Name.Проверка Datagrid для предотвращения дублирования записи

Теперь я хотел бы добавить возможность подтвердить, что запись еще не существует. Если он уже существует, я бы хотел, чтобы одна и та же ячейка была выделена, но с соответствующим сообщением. Поэтому, если пользователь снова вводит «Яйца», сообщение об ошибке ячейки должно быть «Яйца уже есть в списке».

Модель представления позиций не должна знать о модели контейнера, поэтому где я могу проверить дублируемую запись, сохраняя при этом проверку ячейки для свойства «Имя»?

enter image description here

Item в коллекции

public class GroceryItem : ObservableObject, IDataErrorInfo 
{ 

    #region Properties 

    /// <summary>The name of the grocery item.</summary> 
    public string Name 
    { 
     get { return _name; } 

     set 
     { 
      _name = value; 
      RaisePropertyChangedEvent("Name"); 
     } 
    } 
    private string _name; 

    #endregion 

    #region Implementation of IDataErrorInfo 

    public string this[string columnName] { 
     get { 
      if (columnName == "Name") { 
       if (string.IsNullOrEmpty(Name)) 
        return "The name of the item to buy must be entered"; 
      } 

      return string.Empty; 
     } 
    } 

    public string Error { get { ... } } 

    #endregion 
} 

вид Модель проведения Коллекция

public class MainWindowViewModel : ViewModelBase 
{ 

    /// <summary>A grocery list.</summary> 
    public ObservableCollection<GroceryItem> GroceryList 
    { 
     get { return _groceryList; } 

     set 
     { 
      _groceryList = value; 
      RaisePropertyChangedEvent("GroceryList"); 
     } 
    } 
    private ObservableCollection<GroceryItem> _groceryList; 

    /// <summary>The currently-selected grocery item.</summary> 
    public GroceryItem SelectedItem { get; [UsedImplicitly] set; } 

    void OnGroceryListChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // doing non-validation stuff 
    } 
} 

Просмотр Связующие для DataGrid

<DataGrid 
    x:Name="MainGrid" 
    ItemsSource="{Binding GroceryList}" 
    SelectedItem="{Binding SelectedItem}" 
    ...    
    > 
    <DataGrid.Resources> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Setter Property="TextBlock.ToolTip" 
      Value="{Binding Error}" /> 
     </Style> 
    </DataGrid.Resources> 

    <DataGrid.Columns> 
     ... 
     <DataGridTextColumn Header="Item" Width="*" Binding="{Binding Name, ValidatesOnDataErrors=True}" IsReadOnly="false" /> 
    </DataGrid.Columns> 
</DataGrid> 

ответ

1

Я надеваю Не знаю, нарушило ли это MVVM, но так, как я бы это сделал, это передать GroceryList в GroceryItem в другом конструкторе и сохранить его в приватном журнале наблюдения ObservableCollection в GroceryItem. Это просто почтение к GroceryList, поэтому он не добавляет много накладных расходов.

public class GroceryItem : ObservableObject, IDataErrorInfo 
    { 
     private ObservableCollection<GroceryItem> groceryList; 

     public void GroceryItem(string Name, ObservableCollection<GroceryItem> GroceryList) 
     { 
       name = Name; 
       groceryList = GroceryList; 
       // now you can use groceryList in validation 
     } 
    } 
+0

Я думаю, что я не смогу позволить DataGrid автоматически добавлять строки для меня, поскольку для этого потребуется по умолчанию ctor в GroceryItem. Мне понадобится AddCommand на главной модели, которая управляет коллекцией, но да, я согласен, что это определенная возможность. – Berryl

+0

Ваша идея не нарушает ничего о MVVM; Я подумал, что, возможно, со всеми уведомлениями, уже поступающими из привязок данных, я мог бы иметь более свободно связанное решение, которое я просто не вижу. Cheers – Berryl

+0

По умолчанию элемент действительно не знает, что он является членом коллекции - слабо связан. Передача ссылки на коллекцию - это наименее доступный способ попасть в коллекцию из предмета, о котором я могу думать, и многому использую его. – Paparazzi

Смежные вопросы