Как я могу реализовать INotifyPropertyChanged в WPF с шаблоном MVP - PullRequest
0 голосов
/ 04 августа 2020

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

Это моя разметка xaml окна

<ListBox Width="100" Name="Lst" Grid.Column="0" Grid.Row="1" SelectionChanged="Lst_OnSelectionChanged"/>
<Label Width="244" Style="{StaticResource SideText}" x:Name ="LavalIntervalValue" Grid.Row="1" Grid.Column="1" Margin="215,18,0,344" Height="40"/>
<Label Width="244" Style="{StaticResource SideText}" x:Name ="LabelIdValue" Grid.Row="1" Grid.Column="1" Margin="215,73,0,289" Height="40"/>
<Label Width="244" Style="{StaticResource SideText}" x:Name ="LabelStateValue" Grid.Row="1" Grid.Column="1" Margin="215,130,0,232" Height="40"/>
<Label Width="244" Style="{StaticResource SideText}" x:Name ="LabelMeasuredValue" Grid.Row="1" Grid.Column="1" Margin="215,188,0,174" Height="40" />
<Label Width="186" Style="{StaticResource MainText}" Content="Interval" x:Name ="LabelInterval" Grid.Row="1" Grid.Column="1" Margin="11,18,663,344" Height="40"/>
<Label Width="187" Style="{StaticResource MainText}" Content="Id" x:Name ="LabelId" Grid.Row="1" Grid.Column="1" Margin="10,73,663,289" Height="40"/>
<Label Width="186" Style="{StaticResource MainText}" Content="State" x:Name ="LabelState" Grid.Row="1" Grid.Column="1" Margin="11,130,663,233" Height="39"/>
<Label Width="186" Style="{StaticResource MainText}" Content="Measured Value" x:Name ="LabelMeasured" Grid.Row="1" Grid.Column="1" Margin="11,188,663,175" Height="39"/>

Это моя модель

public class Sensor:IObservable
{
    private int _measuredValue;
    private List<IObserver> _observers = new List<IObserver>();
    private IMeasuringState _state = new SimpleState();

    public Sensor(int measuringInterval, SensorType sensorType, int uniqueId)
    {
        MeasuringInterval = measuringInterval;
        SensorType = sensorType;
        UniqueId = uniqueId;
    }


    [JsonIgnore]
    public IMeasuringState MeasuringState
    {
        get => _state;
        set
        {
            if (value!=null)
            {
                _state = value;
              
            }
            NotifyObservers();
        }
    }

    public int UniqueId { get; }

    public int MeasuredValue
    {
        get => _measuredValue;
        set
        {
            _measuredValue = value;
            NotifyObservers();
        }
    }
    public SensorType SensorType { get; }

    public int MeasuringInterval { get; }

    public void ChangeState()
    {
        MeasuringState.Handle(this);
        MeasuringState.StartMeasure(this);
    }
}

Состояние калибровки

public void StartMeasure(Sensor sensor)
{
    _calibrationValue = 0;
    _timer = new Timer(SetCalibration, sensor, 0, 1000);
}

public void Handle(Sensor sensor)
{
    _timer.Dispose();
    sensor.MeasuringState = new WorkState();
}

private void SetCalibration(object obj)
{
    var sensor = obj as Sensor;
    sensor.MeasuredValue = ++_calibrationValue;
}

Это мой интерфейс, который я реализовал в моем главном окне

В свойстве я установил значение содержимого метки с презентатором.

public interface IMainWindowView
{
    List<string> SensorsType { get; set; }
    int SelectedSensor { get; set; }
    int MeasuredValue { get; set; }
    string State { get; set; }
    int Id { get; set; }
    int MeasuringInterval { get; set; }

    event EventHandler<EventArgs> OpenFile;

    event EventHandler<StateEventArgs> DeleteSensorById;

    event EventHandler<EventArgs> SaveFile;

    event EventHandler<EventArgs> SelectedItem;


    event EventHandler<StateEventArgs> ChangeStateSensor;


    event EventHandler<EventArgs> OpenAddWindow;
    void ShowWarning(string message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...