[英]Switch style in StyleSelector based on bound value instead of fixed ViewModel Property
我有一个GridView
,其中的列可以绑定到数值。 我使用它根据视图模型值切换样式。 即如果它是负数,我想显示红色,如果它是正数,那么它应该显示黑色,如果它是 0,我根本不想显示一个值。
我的问题是StyleSelector
的可重用性
public class AmountStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
if (!(item is TransactionVm tran))
return null;
var header = ((GridViewBoundColumnBase)((GridViewCellBase)container).Column).Header;
Style Local(decimal value)
{
if (value == 0) return Empty;
return value <= 0 ? Negative : Positive;
}
// OMG what, surely there is a better way,
// other than switch on the column header name?
return header switch
{
"Debit" => Local(tran.Amount.Debit),
"Credit" => Local(tran.Amount.Credit),
"Total" => Local(tran.Amount.Total),
"Balance" => Local(tran.Amount.Balance),
_ => Positive
};
}
public Style Negative { get; set; }
public Style Positive { get; set; }
public Style Empty { get; set; }
}
如您所见,它被硬连接到列名以选择视图模型值(实际上是绑定值)。
有没有一种方法可以代替实际绑定值?
忽略这里的可视化树,能做这样的事情就好了……
var column = ((GridViewBoundColumnBase)((GridViewCellBase)container).Column);
var value = column.BindingProperty.GetActualTrueToGodBoundValue();
其中列可以绑定到数值。 我使用它根据视图模型值切换样式。
我无法谈论您当前的设计,但是当需要更改可见性、isEnabled 和颜色等项目时... /刷子?
似乎当前的设计已将您编码到众所周知的漏洞中。 大多数情况下应该使用样式来为可见视图提供结构,而该视图的细节可以使用转换器或数据触发器进行更改; 不会因为一种颜色变化而完全改变整个风格(视图的)。
简化您的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.