注释是正确的,即不可能直接将
ConverterParameter
与使用纯 XAML 的变量一起使用。 XAML 就是这样不灵活。
虽然
MultiBinding
可以在这里工作,但我认为这是一种冒险的方法(稍后会详细介绍),而且肯定是矫枉过正。相反,我会简单地在视图模型级别处理这个问题,方法是定义一个 bool
POCO 属性 WarmEnough
,其值源自 Warmed
和 MaxMinutes
:
public class ViewModel : INotifyPropertyChanged
{
public bool WarmEnough => this.Warmed >= this.MaxMinutes;
private double _warmed;
public double Warmed
{
get
{
return _warmed;
}
set
{
if (_warmed == value)
return;
_warmed = value;
OnPropertyChanged();
OnPropertyChanged(nameof(Warmed));
}
}
private double _MaxMinutes;
public double MaxMinutes
{
get
{
return _MaxMinutes;
}
set
{
if (_MaxMinutes == value)
return;
_MaxMinutes = value;
OnPropertyChanged();
OnPropertyChanged(nameof(Warmed));
}
}
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? name = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
然后您只需将触发器绑定到
WarmEnough
属性,而不考虑转换器等。 (只要确保您不需要出于某种原因进行双向绑定即可!)这是有效的,因为每当 WarmEnough
或 Warmed
发生更改时,都会引发 MaxMinutes
的属性更改。因此,每当这些属性中的任何一个发生更改时,都会触发 Trigger
。
从功能上来说,它与
MultiBinding
相同 - 在 Convert
的 IMultiValueConverter
方法中,你基本上会做我建议你在 WarmEnough
的 getter 中做的同样的事情 - 但问题是值将作为 object
数组进入多转换器,您需要检查和转换其类型,这取决于 XAML 中 Binding
的顺序。如果没有明确的文档,这很容易让未来的您和/或您的继任者陷入困境。 IMO MultiBinding
确实最适合所有值都是相同类型并且正确顺序要么明显要么不相关的情况,例如对多个条件进行布尔 AND/OR/XOR 检查、将字符串连接在一起等。可以通过这种方式完成,所以也许克莱门斯会很友善地向我们展示。但我会坚持使用基于视图模型的方法并缩短所有这些。