【问题标题】:RX: 'ObservableAsProperty' bound properties are not automatically updated on guiRX:“ObservableAsProperty”绑定属性不会在 gui 上自动更新
【发布时间】:2019-04-23 20:42:48
【问题描述】:

我有一个客户MyClient,它通过IObservable 提供新的状态。如文档 (https://reactiveui.net/docs/handbook/view-models/boilerplate-code) 中所述,我创建了 ObservableAsProperty 类型的私有属性来获取我的 IObservable 的输出。但要知道我的 GUI 不会在更改时自动更新。

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; }
}

如果我通过xaml 将gui 与我的DataContext 绑定,一切都会按预期进行。 ViewModel.PropertyChanged 被解雇了,所以我不知道那里出了什么问题?! ????

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>

【问题讨论】:

标签: c# wpf reactiveui


【解决方案1】:

如果您在调度程序线程上观察流应该可以工作:

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

【讨论】:

  • 太棒了! ? 但是你能解释一下为什么我必须ObserveOnDispatcher吗?如果我不使用它,该属性也会被设置,propertyChangedEvent 被提升并且xaml 正在按预期工作。我很困惑..
  • @DominicJonas:是的,但是当OneWayBind 尝试从后台线程将绑定应用到TextBlock 时会抛出。
猜你喜欢
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 2011-04-05
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2020-04-08
相关资源
最近更新 更多