Xamarin: установите labelText с экземпляром ViewModel, не обновляя интерфейс - PullRequest
0 голосов
/ 24 мая 2019

Я определил метку в Xaml

<Label Text="{Binding DeviceGuid}"/>

установить BindingContext внутри моей страницы

BindingContext = new BluetoothViewModel();

и написал код для метода получения и установки в ViewModel

private string _deviceGuid;
    public string DeviceGuid
    {
        get
        {
            return _deviceGuid;
        }
        set
        {
            if (_deviceGuid != value)
            {
                _deviceGuid = value;
                OnPropertyChanged();
            }
        }
    }

Так вот простая вещь :). Привязка работает, если я изменяю значение внутри ViewModel. Теперь вот оно: Существуют некоторые фоновые задачи (или просто другие классы), которые, по моему мнению, должны иметь доступ к этому свойству, и если они его напишут, пользовательский интерфейс должен обновляться автоматически. Я думаю, что это плохая практика, но я не знаю, как реализовать это иначе. Я уже пытался создать другой экземпляр модели представления, такой как

BluetoothViewModel a = new BluetoothViewModel();
a.DeviceGuid = "test";

Он вызывает OnPropertyChanged (), но не обновляет интерфейс ... Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Когда вы делаете это:

BluetoothViewModel a = new BluetoothViewModel();
a.DeviceGuid = "test";

Вы создаете другой экземпляр модели представления, который не является тем в вашем BindingContext.

Сделайте это вместо:

public BluetoothViewModel viewmodel;
BindingContext = viewmodel= new BluetoothViewModel();

А потом:

viewmodel.DeviceGuid = "test";
0 голосов
/ 24 мая 2019

Причина, по которой это должно происходить, заключается в том, что вы не вносите эти изменения в MainThread, который является потоком, ответственным за внесение изменений в пользовательском интерфейсе.

Сделайте что-то подобное ниже, где вы изменяете данные свойства:

Device.BeginInvokeOnMainThread(() => {
DeviceGuid="New string"; });

Обновление

Вам следует использовать BindingContext и создать новый экземпляр, так что ваша переменная 'a' должна выглядеть примерно так:

private BluetoothViewModel viewmodel;
BindingContext = viewmodel= new BluetoothViewModel  ();

А потом сделай это

 viewmodel.DeviceGuid="New string";
...