Почему ObservableCollection не обновляется на изменении объектов?

Сокет является коммуникационной конечной точкой. Сокет непосредственно не связан с семейством протокола TCP/IP, он может использоваться с любым протоколом Ваши системные поддержки. API сокета C ожидает, что Вы сначала получите пустой объект сокета от системы, которую можно тогда или связать с локальным адресом сокета (чтобы непосредственно получить входящий трафик для протоколов без установления соединения или принять запросы входящего соединения на протоколы с установлением соединения) или что можно соединиться с удаленным адресом сокета (для любого вида протокола). Можно даже сделать обоих, если Вы хотите управлять обоими, локальный адрес сокета, сокет связывается с и удаленный адрес сокета, с которым подключен сокет. Для протоколов без установления соединения, подключающих сокет, является даже дополнительным, но если Вы не делаете этого, необходимо ли будет также передать адрес назначения с каждым пакетом, который Вы хотите отправить по сокету как, как еще сокет знал бы, куда отправить эти данные в? Преимущество состоит в том, что можно использовать единственный сокет для отправки пакетов в различные адреса сокета. Как только Вам настроили Ваш сокет и возможно даже соединенный, полагаете, что он канал двунаправленной связи. Можно использовать его, чтобы передать данные некоторому месту назначения, и некоторое место назначения может использовать его для пасования назад данных Вам. То, что Вы пишете в сокет, отсылают и что было получено, доступно для чтения.

Порты, с другой стороны - что-то, что только имеют определенные протоколы стека протоколов TCP/IP. TCP и пакеты UDP имеют порты. Порт является просто простым числом. Комбинация исходного порта и целевого порта определяет канал передачи между двумя хостами. Например, у Вас может быть сервер, который должен быть обоими, простым сервером HTTP и простым FTP-сервером. Если бы теперь пакет прибывает для адреса того сервера, как это знало бы, является ли это пакетом для HTTP или FTP-сервера? Ну, это будет знать поэтому, поскольку сервер HTTP будет работать на порте 80 и FTP-сервер на порте 21, поэтому если пакет прибудет с целевым портом 80, это для сервера HTTP а не для FTP-сервера. Также пакет имеет исходный порт, так как без такого исходного порта, сервер мог только иметь одно соединение с одним IP-адресом за один раз. Исходный порт позволяет серверу отличить в других отношениях идентичные соединения: у них всех есть тот же целевой порт, например, порт 80, тот же целевой IP, всегда тот же адрес сервера и тот же исходный IP, как они все прибывают от того же клиента, но как у них есть другой источник порты, сервер может отличить их друг от друга. И когда сервер передает ответы обратно, он сделает так к порту, запрос прибыл из, тот способ, которым клиент может также отличить различные ответы, которые он получает.

7
задан PaN1C_Showt1Me 16 July 2009 в 09:34
поделиться

4 ответа

Коллекция ObservableCollection имеет нет возможности узнать, вносите ли вы изменения в содержащиеся в нем объекты - если вы хотите получать уведомления об изменении этих объектов, вам также необходимо сделать эти объекты наблюдаемыми (например, заставив эти объекты реализовать INotifyPropertyChanged)

12
ответ дан 6 December 2019 в 15:25
поделиться

Вероятно, потому что элементы не имеют возможности предупреждать коллекцию, когда они редактируются - т.е. они могут быть не наблюдаемыми. Другие классы будут иметь аналогичное поведение - невозможно предупредить вас о каждом изменении в графе классов, на которые имеются ссылки.

0
ответ дан 6 December 2019 в 15:25
поделиться

В качестве временного решения вы можете извлечь объект из коллекции, а затем повторно вставить его после завершения обработки. Однако, в зависимости от ваших требований и модели параллелизма, это может сделать программу некрасивой. Это быстрый прием, который не подходит для всего, что требует качества.

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

В идеале, как говорит kragen2uk, было бы лучше сделать объекты наблюдаемыми и сделать ваш клиентский код чистым и простым.

см. Также этот вопрос .

0
ответ дан 6 December 2019 в 15:25
поделиться

Другой способ добиться этого - реализовать новый класс XXXViewModel, производный от DependencyObject, и поместить его в ObservableCollection.

для этого взгляда на это очень хорошее введение в MVVM: http://blog.lab49.com/archives/2650

пример для такого класса:

public class EntryViewModel : DependencyObject
{
    private Entry _entry;
    public EntryViewModel(Entry e)
    {
        _entry = e;
        SetProperties(e);
    }

    private void SetProperties(Entry value)
    {

        this.Id = value.Id;
        this.Title = value.Title;
        this.CreationTimestamp = value.CreationTimestamp;
        this.LastUpdateTimestamp = value.LastUpdateTimestamp;
        this.Flag = value.Flag;
        this.Body = value.Body;
    }


    public Entry Entry
    {
        get {
            SyncBackProperties();
            return this._entry;
        }
    }


    public Int64 Id
    {
        get { return (Int64)GetValue(IdProperty); }
        set { SetValue(IdProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Id.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IdProperty =
        DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64()));

}}

здесь важные вещи: {{ 1}} - он является производным от DependencyObject - он работает с DependencyProperties для поддержки привязки данных WPF

br sargola

1
ответ дан 6 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: