1

警告:
对于 ReactiveUI 来说是全新的。试图完全使用 RxUI,目的是从不设置视图的 DataContext。我相信这是可以做到的!

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

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

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

提前致谢!

编辑 1 - 根据 Glenn Watson 对帖子的评论尝试 1

        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 的回答。

4

2 回答 2

2

我会推荐一些接近你所拥有的解决方案的东西:

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()。它不应该与你所拥有的那么不同。

于 2018-11-30T21:36:38.480 回答
0

我有几个想法。没有时间先尝试它们,但它们可能会有所帮助。

  1. 您可以尝试将触发器直接嵌入到按钮的资源中,然后仍将按钮名称用于 onewaybind。

  2. 您可以尝试为按钮定义一个新的 DataTemplate 并定位具有触发器属性的视图模型。

于 2018-11-27T20:59:55.493 回答