2016-09-15 2 views
1

У меня есть следующие вещи:Избегайте добавления же элемента в наблюдаемых коллекции с помощью C#

ObservableCollection<dateListModel> model = new ObservableCollection<dateListModel>(); 

public class dateListModel 
{ 
    public string dateSelected { get; set; } 
    public string requestFor { get; set; } 
    public int id { get; set; } 
    public string weekDay { get; set; } 
} 

Добавление элемента к ObservableCollection, используя следующий код:

public void onAddClicked(object sender, EventArgs e) 
     {   
      try 
      { 
       if (model.Any (p =>string.Format("{0:yyyy-MM-dd}", p.dateSelected.ToString())==string.Format ("{0:yyyy-MM-dd}",myDatePicker.Date.ToString()) == false)) 
       { 
        model.Add (new dateListModel { 
         dateSelected = string.Format("{0:yyyy-MM-dd}", myDatePicker.Date), 
         requestFor = requestFor.Items [requestFor.SelectedIndex], 
         id = 1, 
         weekDay = myDatePicker.Date.DayOfWeek.ToString() 
        }); 

        listview_MenuItem.ItemsSource = model; 
       } 
       else 
        DisplayAlert ("Alert", "Already Exist!", "OK"); 
      } 
      catch(Exception ex) 
      { 
       DisplayAlert ("Alert",ex.ToString(),"OK"); 
      } 
     } 

Но когда я нажимаю на кнопку Добавить это шоу «Уже Exist ", даже модель пуста. Любой, как я добавил элемент в модель и пытаюсь добавить тот же элемент снова, он позволяет добавить в ObservableCollection. Я не хочу добавлять ту же дату в мою модель. Где я ошибаюсь?

ответ

1

Попробуйте это:

if (!model.Any(p => p.dateSelected.Date == myDatePicker.Date)) 
{ 
    model.Add (new dateListModel { dateSelected = string.Format("{0:yyyy-MM-dd}", myDatePicker.Date), requestFor = requestFor.Items [requestFor.SelectedIndex], id = 1, weekDay = myDatePicker.Date.DayOfWeek.ToString()}); 
    listview_MenuItem.ItemsSource = model; 
} 

Вам не нужно конвертировать все даты в том же формате строки сначала проверить, если запись с этой датой существует в базе данных. Кроме того, !Any... эквивалентен Any... == false

+0

я использовал: если (model.Any (р => p.dateSelected.date == myDatePicker.Date.ToString (!))). Это не работает. Чтобы сделать работу над кодом, какой должен быть формат даты DatePicker? – Dipak

+0

Формат даты не имеет значения, если вы используете '.Date'. Поэтому удалите '.ToString()' из вашего 'myDatePicker.Date.ToString()' и попробуйте. Также у меня была опечатка, она должна быть 'p.dateSelected.Date' вместо' p.dateSelected.date' –

+0

Привет, спасибо. Я использовал: if (! Model.Any (p => Convert.ToDateTime (p.dateSelected.date) == myDatePicker.Date)). Хорошо работает. – Dipak

0

Вы можете сравнить две даты напрямую, не преобразовывая их в строку. добавьте примечание, что вам нужно не использовать .ToString(), чтобы получить дату в определенном формате, когда вы используете, так что дата преобразуется в строку, а затем формат не будет применяться, как вы ожидали. Если вы идете с .ToString(), тогда укажите формат в качестве аргумента метода (например, DateTime.Now.ToString("yyyy-MM-dd")).

Короче говоря, вы должны изменить условие, подобное этому, чтобы оно работало.

if (!model.Any(p =>p.dateSelected==myDatePicker.Date)) 
{ 

    // Add new object to the collection 
} 
else 
    DisplayAlert ("Alert", "Already Exist!", "OK"); 
+0

Мы не можем сравнивать дату и строку (поскольку p.dateselected является строкой) – Dipak

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