Инициировать событие, измененное свойством, снаружи кода позади (частичный класс) - PullRequest
0 голосов
/ 04 июня 2019

Я написал простой пользовательский интерфейс с использованием WPF / XAML и успешно использовал метод iNotifyPropertyChanged для обновления некоторых значений .... Ура!

XAML:

<TextBlock Grid.Column="3" Grid.Row="1" Margin=" 1" Text="{Binding DeviceType, StringFormat=0, Mode=OneWay}" FontFamily="Nexa"/>
<TextBlock Grid.Column="3" Grid.Row="2" Margin= "1" Text="{Binding DeviceSerial, StringFormat=0, Mode=OneWay}" FontFamily="Nexa"/>
<TextBlock Grid.Column="3" Grid.Row="3" Margin=" 1" Text="{Binding DeviceName, StringFormat=0, Mode=OneWay}"  FontFamily="Nexa"/>
<TextBlock Grid.Column="3" Grid.Row="4" Margin=" 1" Text="{Binding DeviceBatteryLevel, StringFormat=0, Mode=OneWay}"  FontFamily="Nexa"/>

Код позади:

public partial class MainWindow : Window
{
    public InstrumentViewModel Instrument = new InstrumentViewModel();

    public MainWindow()
    {
        InitializeComponent();

        this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

        DataContext = Instrument;    

        var collection = new PortableDeviceCollection();

        collection.Refresh();

        foreach (var device in collection)
        {
            device.Connect();

            if (device.DeviceModel == "Instrument Test Platform")
            {

                Instrument.DeviceType = device.DeviceModel;
                Instrument.DeviceSerial = device.DeviceSerialNumber;
                Instrument.DeviceName = device.FriendlyName;

            }
        }

    }
}

Это работает абсолютно нормально.Однако я бы хотел использовать таймер для опроса устройств.Когда я делаю это и пытаюсь использовать метод INotifyPropertyChanged из события таймера, свойства в моем классе инструментов обновляются, но привязки XAML не устанавливаются.

Я пытаюсь:

public partial class MainWindow : Window
{

    public InstrumentViewModel Instrument = new InstrumentViewModel();

    public MainWindow()
    {
        InitializeComponent();

        this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

        DataContext = Instrument;    

        Timer intervalTimer = new Timer(5000);
        intervalTimer.Enabled = true;
        intervalTimer.AutoReset = true;
        intervalTimer.Elapsed += OnTimedEvent;

    }

    private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
    {

        InstrumentViewModel Instrument = new InstrumentViewModel();

        var collection = new PortableDeviceCollection();

        collection.Refresh();

        foreach (var device in collection)
        {
            device.Connect();

            if (device.DeviceModel == "Instrument Test Platform")
            {

                Instrument.DeviceType = device.DeviceModel;
                Instrument.DeviceSerial = device.DeviceSerialNumber;
                Instrument.DeviceName = device.FriendlyName;

            }
        }
    }
}

Я предполагаю, что здесь отсутствует какой-то фундаментальный элемент, но я предполагал, что метод OnTimedEvent, находящийся в классе MainWindow, все же сможет получить доступ к DataBinding из кода XAML.

Это связано с тем, где я устанавливаю DataContext = Instrument;?

Любой совет приветствуется.

Спасибо.

...