«Прослушивание» изменения поля с помощью обработчика событий вне объекта, которому принадлежит поле - PullRequest
0 голосов
/ 23 мая 2018

Я работаю над проектом-модулем C #, который спроектирован так, чтобы быть в состоянии быть «привязанным» к различным проектам.Включив его в пространство имен, пользователь сможет создать экземпляр объекта MonitoringModule -типа.
Этот объект предназначен для записи устройств, которые он должен «отслеживать».Я отслеживаю перечисление типа устройства, когда устройство передается в MonitoringModule, оно будет ожидать, что параметр типа устройства будет знать, какие поля он должен отслеживать на этом устройстве.
Каждое устройство расширяет IDeviceинтерфейс, который заставляет его иметь стандартные поля устройства (имя и тип, версия прошивки, серийный номер, и тому подобное).Эти поля являются частными, но имеют глобальные методы получения и установки.Глобальный установщик записывается так (Дисплей является примером типа устройства):

public class Display : IDevice
{
    private string firmware;
    public event StateChangedEventHandler StateChanged;

    public string Firmware
    {
        get { return this.firmware; }
        set
        {
            this.firmware = value;
            this.OnStateChanged(new StateChangedEventArgs(this, "firmware"))
        }
    }
}

Модуль мониторинга, в свою очередь, имеет прослушиватель, на который он подписывается всякий раз, когда ему предлагается отслеживать новое устройство

public class MonitoringModule
{
    public void addDevice(IDevice device, DeviceType.Display deviceType)
    {
        //add the device to monitoringmodule
        //maybe something deviceType specific
        device.StateChanged += new StateChangedEventHandler(device_stateChanged);
    }

    void device_StateChanged(object sender, StateChangedEventArgs e)
    {
        //here it does things with the received e.device and it's e.changedState
    {
}

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

1 Ответ

0 голосов
/ 23 мая 2018

Вот что я бы сделал.У вас есть IDevice орудие INotifyPropertyChanged.(прочитайте ссылку)

Все ли устройства имеют одинаковые свойства, которые вы хотите посмотреть?Затем попросите базовый класс сделать это: class abstract DeviceBase : IDevice

Вы также можете написать собственный метод Set, который избавит вас от двух строк кода в каждом установщике.У легкого инструментария MVVM есть такой метод: http://www.mvvmlight.net/help/WP8/html/4162331c-43b6-7806-f488-8f6426aa0304.htm

...