c# - RxUI - WPF - 不带 DataContext 的样式 DataTrigger 绑定(bind)

标签 c# wpf reactiveui multidatatrigger

警告:
ReactiveUI 全新。尝试全面使用 RxUI,目的是从不设置 View 的 DataContext。我相信这是可以做到的!

场景:
我有一个按钮,该按钮有一个样式,该按钮的样式有一个 MultiDataTrigger,第一个条件是 IsMouseOver,第二个条件是我的 bool 类型的 ViewModel 上的属性。然后,这会更改按钮的背景或前景。传统上,您只需将第二个条件绑定(bind)到 ViewModel 的属性。

是否有一种可行的方法可以让这种交互在不使用 DataContext 的情况下工作,但仍然具有我期望的相同结果?我无法直接访问条件绑定(bind),因为它没有名称。所以必须有一些奇怪的设置才能让它工作。

解决方案不太喜欢:
我可能会添加一个不可见的控件,为其命名,然后使用 this.OneWayBind() 将该属性绑定(bind)到该控件的“IsEnabled”属性。这样做时,按钮的 MultiDataTrigger 的第二个条件可以使用基于 ElementName 及其 IsEnabled 路径的绑定(bind)。这将允许我不使用 DataContext,但对于我的口味来说似乎太“hacky”。必须有另一种方法!

提前致谢!

编辑 1 - 尝试 1 基于 Glenn Watson 对帖子的评论

        this.WhenActivated(disposables =>
        {
            this.WhenAnyValue(x => x.TheButton.IsMouseOver, x => x.ViewModel.SomeBoolValue).Subscribe(x =>
            {
                if (!x.Item1)
                    TheButton.Background = x.Item2 ? Brushes.Gray : Brushes.Blue;
                else
                    TheButton.Background = x.Item2 ? Brushes.Red : Brushes.Green;
            }).DisposeWith(disposables);
        });

编辑 2 - 实现/使用 Glenn Watson 的答案。

最佳答案

我会推荐一些接近您的解决方案:

this.WhenAnyValue(x => x.TheButton.IsMouseOver, x => x.ViewModel.SomeBoolValue,
      (isMouseOver, boolValue) => 
      {
         if (isMouseOver)
           return boolValue ? Brushes.Gray : Brushes.Blue;
         else 
           return boolValue ? Brushes.Red : Brushes.Green;
      })
      .BindTo(this, view => view.TheButton.Background)
      .DisposeWith(disposables);

修改使用第三个参数,该参数接受前两个值的参数化 lambda,然后仅使用 BindTo()。它应该与您所拥有的没有那么不同。

关于c# - RxUI - WPF - 不带 DataContext 的样式 DataTrigger 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53507944/

相关文章:

c# - 如何在 ReactiveUI 7 中直接调用 ReactiveCommand.Execute() 正确?

mvvm - ReactiveUI.Routing 对 Splat 的依赖

c# - 无需等待的任务异常处理

c# optimizing cycle working with big numbers 工作大数

c# - 使用来自另一个控件的值的验证规则

wpf - 如何在 WPF MVVM 应用程序中传递 DataGridCellEditEventArgs

c# - TabItem 标题垂直

c# - 不要在 Entity Framework 中映射 ReactiveUI 属性

c# - 使用 C# .NET 中的 XDocument 库删除内部节点,但不删除 xml 中的值

c# - 下面的空条件运算符有什么问题?