RX: 'ObservableAsProperty' bound properties are not automatically updated on gui

余生长醉 提交于 2020-01-16 14:34:03

问题


I have a Client MyClient which provides new stati via an IObservable. As described in the documentation (https://reactiveui.net/docs/handbook/view-models/boilerplate-code) I made a private property of type ObservableAsProperty to get the output of my IObservable. But know my GUI is not updated automatically on changes.

public partial class MainWindow : ReactiveWindow<AppViewModel>
{
    public MainWindow()
    {
        InitializeComponent();
        ViewModel = App.Container.GetInstance<AppViewModel>();
        this.WhenActivated(r =>
            {
                this.OneWayBind(ViewModel, viewModel => viewModel.Status.AoiStatus, view => view.StatusTxtbl.Text).DisposeWith(r);
            });
    }
}

public class AppViewModel : ReactiveObject
{

    public IStatus Status { [ObservableAsProperty] get; }

    public MyClient Client { get; }

    public AppViewModel(MyClient client)
    {
        Client = client;
        Client.StatusStream().ToPropertyEx(this, x => x.Status);
    }
}

public interface IStatus
{
    string AoiStatus { get; }
}

If I bind the gui via xaml with my DataContext, everything works as expected. ViewModel.PropertyChanged is fired, so I don't know what's wrong there?! 😬

public partial class MainWindow : ReactiveWindow<AppViewModel>
{
    public MainWindow()
    {
        InitializeComponent();
        ViewModel = App.Container.GetInstance<AppViewModel>();
        DataContext = this;
    }
}

public class AppViewModel : ReactiveObject
{

    public IStatus Status { [ObservableAsProperty] get; }

    public MyClient Client { get; }

    public AppViewModel(MyClient client)
    {
        Client = client;
        Client.StatusStream().ToPropertyEx(this, x => x.Status);
    }
}

public interface IStatus
{
    string AoiStatus { get; }
}
<TextBlock>
    <Run Text="Status:" />
    <Run Text="{Binding ViewModel.Status.AoiStatus, Mode=OneWay}"/>
</TextBlock>

回答1:


Should work if you observe the stream on the dispatcher thread:

public AppViewModel(MyClient client)
{
    Client = client;
    Client.StatusStream().ObserveOnDispatcher().ToPropertyEx(this, x => x.Status);
}


来源:https://stackoverflow.com/questions/55810911/rx-observableasproperty-bound-properties-are-not-automatically-updated-on-gui

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!