none
Если класс, определённый в WCF-службе, содержит свойство, изменяющееся значение которого должно отображаться в окне WPF-клиента, то нужно ли в этом классе реализовать INotifyPropertyChanged ? RRS feed

  • Вопрос

  • У меня в WCF-службе определён класс Downloader, предоставляющий информацию о состоянии выполнения закачки закачиваемого интернет-ресурса. См. сокращённый код этого класса ниже:

    /// <summary>
    /// Представляет информацию о состоянии выполнения закачки заданного интернет-ресурса.
    /// </summary>
    [DataContract]
    public class Downloader
    {
             /// <summary>
             /// Общее количество уже закаченных байт из скачиваемого ресурса.
             /// </summary>
             private Int64 _downloadedBytesQuantity;
    
             /// <summary>
             /// Возвращает или задаёт общее количество уже закаченных байт из скачиваемого ресурса.
             /// </summary>
             [DataMember]
             public Int64 DownloadedBytesQuantity
             {
                     get { return _downloadedBytesQuantity; }
                     set { _downloadedBytesQuantity = value; }
             }
    }

    Этот класс определён в файле IDownloadManagerService.cs, в котором определён интерфейс IDownloadManagerService, описывающий контракты службы (здесь я этого не привожу).

    В файле DownloadManagerService.cs, который содержит класс DownloadManagerService, реализующий IDownloadManagerService, я определяю, в классе DownloadManagerService, экземпляр ObservableCollection, содержащий экземпляры Downloader:

    #region Fields
    /// <summary>
    /// Коллекция закачек, которые выполняются или ожидают выполнения.
    /// </summary>
    private static ObservableCollection<Downloader> _downloads = new ObservableCollection<Downloader>();
    #endregion
    
    #region Properties
    /// <summary>
    /// Возвращает коллекцию закачек, которые выполняются или ожидают выполнения.
    /// </summary>
    public static ObservableCollection<Downloader> Downloads
    {
           get { return _downloads; }
    }
    #endregion
    К этой службе у меня есть клиент, написанный на WPF. Я хочу, что бы после выполнения операции "Добавить ссылку на службу", коллекция Downloads была доступна клиенту (видна ему). В окне клиента я хочу разместить DataGrid и привязать его к коллекции Downloads, что бы в этом DataGrid отображалось изменяющееся значение свойства DownloadedBytesQuantuty . Вопрос у меня следующий: Нужно ли мне, в этом случае, реализовать в классе Downloader интерфейс INotifyPropertyChanged для того, что бы в DataGrid на клиенте, привязанной к коллекции Downloads, были видны изменения значения свойства Downloader.DownloadedBytesQuantity всякий раз, когда эти изменения выполняются WCF-службой?


    28 июня 2014 г. 8:27

Ответы

  • Что именно хотите получить в итоге?

    Как я понял, нужно, чтобы при изменении значения в службе это изменение было видно на клиенте? Нет, реализация этого интерфейса в классе службы не сделает это автоматически. Изменение нужно посылать клиенту.

    • Помечено в качестве ответа Purple_Apple 30 июня 2014 г. 8:11
    29 июня 2014 г. 13:47

Все ответы

  • А разве INotifyPropertyChanged не будет сгенерирован автоматически, когда вы добавите в проект клиента службу с помощью Add Service Reference?

    У меня к вам вопрос: почему в службе статические члены? Служба рассчитана на подключение максимум одного клиента? Ведь если клиентов будет несколько, то нужно для каждого иметь собственную коллекцию закачек.

    28 июня 2014 г. 12:20
  • 1) Я не знал, что INotifyPropertyChanged будет сгенерирован автоматически, при добавлении службы к клиенту. Т.е. получается, что в службе явно добавлять его не надо?

    2) На счёт того, что ObservableCollection у меня static это вы подметили верно, поправлю. Спасибо.



    28 июня 2014 г. 12:45
  • Так нужно в службе явно реализовать INotifyPropertyChanged или нет?
    29 июня 2014 г. 11:49
  • Что именно хотите получить в итоге?

    Как я понял, нужно, чтобы при изменении значения в службе это изменение было видно на клиенте? Нет, реализация этого интерфейса в классе службы не сделает это автоматически. Изменение нужно посылать клиенту.

    • Помечено в качестве ответа Purple_Apple 30 июня 2014 г. 8:11
    29 июня 2014 г. 13:47