![](/img/trans.png)
[英]WPF Style DataTrigger with binding to DataContext not working
[英]RxUI - WPF - Style DataTrigger binding with no DataContext
警告:
全新的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-实施/使用格伦·沃森的答案。
我会推荐一些接近您所拥有的解决方案的方法:
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()。 它应该与您所拥有的没什么不同。
我有两个主意。 没有时间先尝试它们,但它们可能会有所帮助。
您可以尝试将触发器直接嵌入按钮的资源中,然后仍将按钮名称用于onewaybind。
您可以尝试为按钮定义一个新的DataTemplate并定位具有触发属性的视图模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.