【问题标题】:How to get Binding value of current cell in a WPFToolkit DataGrid如何在 WPFToolkit DataGrid 中获取当前单元格的绑定值
【发布时间】:2009-03-26 15:01:21
【问题描述】:

我想更改包含负数的单元格的前景色,但我不知道如何指定可以让我使用的 DataTrigger。我正在使用这样的东西:

<Style x:Key="NumberCellStyle" BasedOn="{StaticResource CellStyle}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Converter={StaticResourceExtension SignConverter}}" Value="-1">
            <Setter Property="TextBlock.Foreground" Value="Red"/> 
        </DataTrigger>
    </Style.Triggers>
</Style>

但在 SignConverter 转换器中,我得到了整个 ViewModel 而不是我想要转换的数值。我希望它可以在整个应用程序中运行,而无需为每个绑定指定正确的路径。

非常感谢!

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    更好的方法是编写一个自定义列。

    以下代码适用于处于相同情况的任何人:

    public class DataGridDecimalColumn : DataGridTextColumn
    {
        Binding               foregroundBinding;
        DecimalBrushConverter brushConverter = new DecimalBrushConverter {
            NegativeBrush = Brushes.Red, 
            PositiveBrush = Brushes.Black, 
            ZeroBrush     = Brushes.Black,
        };
    
        protected override FrameworkElement 
        GenerateElement(DataGridCell cell, object dataItem)
        {
            var element = base.GenerateElement(cell, dataItem) as TextBlock;
            element.SetBinding(TextBlock.ForegroundProperty, GetForegroundBinding());
            return element;
        }
    
        Binding
        GetForegroundBinding()
        {
            if(foregroundBinding == null) {
                var binding       = (Binding)Binding;
                foregroundBinding = new Binding {
                    Path      = binding.Path,
                    Converter = BrushConverter,
                };
            }
            return foregroundBinding;
        }
    
        public DecimalBrushConverter 
        BrushConverter
        {
            get { return brushConverter; }
            set { brushConverter = value; }
        }
    }
    

    DecimalBrushConverter 简单带小数?并根据其值将其转换为指定的画笔之一。

    【讨论】:

      【解决方案2】:

      您还应用了什么控件?听起来你应用它的任何东西都没有为自己设置任何特定的绑定,所以它只是继承了它的父母的价值,最终成为你的 ViewModel 实例。

      更新:根据评论,我认为您需要在样式的 Binding 表达式中指定 Path。由于没有指定路径,它只使用当前的DataContext,最终成为整个ViewModel 实例。

      【讨论】:

      • 我正在使用 WPFToolkit 的 DataGrid,您可以在其中为不同类型的列指定绑定。在这种情况下,它是 DataGridTextColumn 的 ElementStyle。单元格显示数字,但我得到的是 ViewModel。
      • 我明白,我想要的不是指定路径,因此如果数字为负数,任何将包含数字并获得此样式的列都可以涂成红色。有什么办法可以获取另一个绑定中指定的路径?
      • 老实说,我不确定。如果该列有一个 DataContext,我会说将该列的数据绑定到该列,这样就可以了,但是它看起来没有 DataContext。所以我不确定是否有办法,不幸的是。
      • 好的,没问题。谢谢你的时间! =)
      【解决方案3】:

      好的,我没有找到解决原始问题的方法,但我将使用 DataGridTemplateColumn 和模板来解决它,该模板根据绑定到它们的值正确设置前景色。

      【讨论】:

        【解决方案4】:

        如何让这段代码读取 DataGrid 本身的 IsSelected 属性?我尝试了以下代码,但无法弄清楚如何将 bool 值获取到 ConverterParameter 中,其中 DecimalBrushConverter 读取参数并在 isSelected==true 时提供 SelectedBrush。

        公共类 DataGridDecimalColumn : DataGridTextColumn { 私有只读 DecimalBrushConverter _brushConverter = new DecimalBrushConverter { NegativeBrush = Brushes.Red, PositiveBrush = Brushes.Black, ZeroBrush = Brushes.Black, SelectedBrush = Brushes.White };

            private Binding _foregroundBinding;
        
            private DecimalBrushConverter BrushConverter
            {
                get { return _brushConverter; }
            }
        
        
        
            protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
            {
                var element = base.GenerateElement(cell, dataItem) as TextBlock;
        
                if (element != null)
                    element.SetBinding(TextBlock.ForegroundProperty, GetForegroundBinding());
        
                return element;
            }
        
        
        
            private Binding GetForegroundBinding()
            {
                if (_foregroundBinding == null)
                {
                    var binding = (Binding) Binding;
                    var bindingToRow = new Binding
                                           {
                                               Path = new PropertyPath("IsSelected"),
                                               RelativeSource=new RelativeSource(RelativeSourceMode.FindAncestor,typeof(DataGridRow),1)
                                           };
                    _foregroundBinding = new Binding
                                             {
                                                 Path = binding.Path,
                                                 Converter = BrushConverter,
                                                 ConverterParameter = bindingToRow
                                             };
                }
                return _foregroundBinding;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-11-02
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 2013-02-19
          • 1970-01-01
          • 2017-10-04
          相关资源
          最近更新 更多