RxUI-WPF-样式DataTrigger绑定,无DataContext

时间:2018-11-27 20:51:07

标签: c# wpf reactiveui multidatatrigger

注意:
全新的ReactiveUI。尝试完全使用RxUI,以永不设置视图的DataContext。我相信可以做到!

场景:
我有一个按钮,并且按钮具有样式,并且该按钮的样式具有MultiDataTrigger,其中第一个条件是IsMouseOver,第二个条件是我的bool类型的ViewModel上的属性。然后,这将更改按钮的背景或前景。传统上,您只需将第二个条件绑定到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的答案。

2 个答案:

答案 0 :(得分: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()。它应该和您所拥有的没什么不同。

答案 1 :(得分:0)

我有两个主意。没有时间先尝试一下,但可能会有所帮助。

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

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