代码之家  ›  专栏  ›  技术社区  ›  TheGeneral

基于与固定ViewModal属性相对的绑定值在StyleSelector中切换样式

  •  0
  • TheGeneral  · 技术社区  · 4 年前

    我有一个 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();
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   ΩmegaMan    4 年前

    其中列可以绑定到数值。我使用它来根据视图模型值切换样式。

    我不能谈论你目前的设计,但当需要更改项目时,如可见性、启用状态和颜色。。。为什么不对目标值进行多重构建,并使用一个转换器,该转换器将接受1到多个项目并返回颜色/画笔?

    看来目前的设计已经把你编码到了众所周知的洞里。在大多数情况下,应该使用样式为可见视图提供结构,而该视图的细节可以使用转换器或数据触发器进行更改;不改变整个风格( 的观点 )完全为 一种颜色变化 .

    简化你的设计。