Проверка достоверности данных для предотвращения повторного ввода - PullRequest
1 голос
/ 21 февраля 2012

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

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

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

enter image description here

Элемент в коллекции

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 Ответ

1 голос
/ 21 февраля 2012

Я не знаю, нарушает ли это MVVM, но способ, которым я бы это сделал, - передать GroceryList GroceryItem в другом конструкторе и сохранить его в частном ObservableCollection groceryList в 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
         }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...