繁体   English   中英

根据绑定值而不是固定的 ViewModel 属性在 StyleSelector 中切换样式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM