2013-12-23 6 views
2

У меня есть простое приложение, где ObservableCollection обновляется в коде и когда новый элемент добавлен, пользовательский интерфейс также обновляется. Чтобы обновить интерфейс, я использую диспетчер , который передается как свойство ViewModel. Мой код работает, но я не знаю, правильно я или нет.Как обновить интерфейс при обновлении ObservableCollection?

Вот код:

MainWindow.xaml.cs

/// <summary> 
/// Логика взаимодействия для MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    MainWindowViewModel model = new MainWindowViewModel(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = model; 
     this.model.dispatcher = this.Dispatcher;  
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     string url = urlToCheck.Text; 

     Task task = new Task(() => 
     { 
      model.GetUrls(url); 
     }); 

     task.ContinueWith((previousTask) => 
     { 
      label.Content = "Все ссылки собраны."; 
     }, 
     TaskScheduler.FromCurrentSynchronizationContext()); 

     label.Content = "Идёт сбор ссылок..."; 
     task.Start(); 
    } 
} 

MainWindowViewModel.cs

class MainWindowViewModel 
{ 
    public ObservableCollection<Url> Urls { get; set; } 
    public bool NeedToGetResponseForChildUrls { get; set; } 
    public bool NeedToDeletePreviousResults { get; set; } 
    public Dispatcher dispatcher; 

    some code..................... 


     **and something like this i am updating ObservableCollection:** 

     if (NeedToDeletePreviousResults) 
      { 
       dispatcher.Invoke(() => 
       { 
        Urls.Clear(); 
       }); 

      } 

Url.cs

using System.Collections.ObjectModel; 
using System.ComponentModel; 

namespace CheckUrl 
{ 
    public class Url : INotifyPropertyChanged 
    { 
     private string _absoluteUrl; 
     public string AbsoluteUrl 
     { 
      get { return _absoluteUrl; } 
      set 
      { 
       if (_absoluteUrl != value) 
       { 
        _absoluteUrl = value; 
        OnPropertyChanged("AbsoluteUrl"); 
       } 
      } 
     } 

     private int _responseStatusCode; 
     public int ResponseStatusCode 
     { 
      get { return _responseStatusCode; } 
      set 
      { 
       if (_responseStatusCode != value) 
       { 
        _responseStatusCode = value; 
        OnPropertyChanged("ResponseStatusCode"); 
       } 
      } 
     } 

     private string _responseStatusDescription; 
     public string ResponseStatusDescription 
     { 
      get { return _responseStatusDescription; } 
      set 
      { 
       if (_responseStatusDescription != value) 
       { 
        _responseStatusDescription = value; 
        OnPropertyChanged("ResponseStatusDescription"); 
       } 
      } 
     } 

     public enum Status { Working, Broken }; 

     private Status _urlStatus; 
     public Status UrlStatus 
     { 
      get { return _urlStatus; } 
      set 
      { 
       if (_urlStatus != value) 
       { 
        _urlStatus = value; 
        OnPropertyChanged("UrlStatus"); 
       } 
      } 
     } 

     private string _color; 
     public string Color 
     { 
      get { return _color; } 
      set 
      { 
       if (_color != value) 
       { 
        _color = value; 
        OnPropertyChanged("Color"); 
       } 
      } 
     } 

     private ObservableCollection<ChildUrl> _childUrlsValue = new ObservableCollection<ChildUrl>(); 
     public ObservableCollection<ChildUrl> ChildUrls 
     { 
      get 
      { 
       return _childUrlsValue; 
      } 
      set 
      { 
       _childUrlsValue = value; 
      } 
     } 

     /// <summary> 
     /// Конструктор класса Url. 
     /// </summary> 
     public Url(string absoluteUrl, int responseStatusCode, string responseStatusDescription, Status urlStatus, string color) 
     { 
      this.AbsoluteUrl = absoluteUrl; 
      this.ResponseStatusCode = responseStatusCode; 
      this.ResponseStatusDescription = responseStatusDescription; 
      this.UrlStatus = urlStatus; 
      this.Color = color; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 
+0

Можете ли вы показать свой код класса Url? – Vishal

+0

Вы должны предпочесть использовать FromCurrentSynchronizationContext в модели, чтобы избежать связи с инфраструктурой пользовательского интерфейса. –

+0

Это также плохая форма для добавления логического кода в ваш класс окна, как это. Создайте свойство ICommand в своей модели, назначьте ему RelayCommand и привяжите его к свойству Command кнопки вместо обработчика Click. –

ответ

2

ObservableCollection может автоматически обновлять ваш пользовательский интерфейс, используя привязку. Используйте список ObservableCollection и добавьте/удалите элементы из. Сделать ObservableCollection как общественный property.In конструктора запись MainWindow:

This.DataContext=This; 

Использование привязки к вашему ListBox/любому другому элементу управления, Вы должны показать пункты. ObservableCollection allready реализует в нем IINotifyPropertyChanged. После изменения элементов в ObservableCollection ваш пользовательский интерфейс также изменится.

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