radgridview更改{}之间文本的颜色

时间:2014-03-10 09:08:38

标签: c# wpf datagrid telerik

我正在使用RadGridView在列中显示一些字符串数据。我正在使用数据绑定。我的一些文本字符串的部分文本被{}包围,我想以不同的颜色显示该文本。

从网上四处查看我发现我可以在文本块中更改文本的文本颜色,但我无法将其应用于数据绑定数据网格列。

有人可以建议这是否可行。

--- --- EDIT

Heres xaml我定义datacolumn:

<telerik:GridViewDataColumn x:Name="colMasterValue" Header="Localise - Master Value" DataMemberBinding="{Binding MasterValue}" ShowDistinctFilters="False" IsReadOnly="True"/>

继承人的展示: enter image description here

所以我想要的是{Customer.Panel.field}以不同的颜色显示。

1 个答案:

答案 0 :(得分:0)

让我们尝试下一个解决方案。

  1. 将使用自定义TextBlock,可以将常规字符和&#39; {&#39;或者&#39;}&#39;。
  2. 让我们添加替换机制,可以用装饰文本替换原始文本。所有文字除了&#39; {&#39;或者&#39;}&#39;}以某种方式着色。
  3. 以下是xaml代码:

                    <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=Text}"
                                            Header="HeaderName"
                                            IsFilterable="False" IsReorderable="False">
                    <telerik:GridViewDataColumn.CellTemplate>
                        <DataTemplate DataType="flowConfiguration:SomeDataType">
                            <modules:MyTextBlock Text="{Binding Text, 
                                    UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </telerik:GridViewDataColumn.CellTemplate>
    

    以下是MyTextBlock代码

    public class MyTextBlock:TextBlock
    {
        private DependencyPropertyDescriptor _descriptor;
        private bool _isUpdating;
    
        public MyTextBlock()
        {
            this.Unloaded += OnUnloaded;
            _descriptor = DependencyPropertyDescriptor.FromProperty(TextProperty, typeof(TextBlock));
            _descriptor.AddValueChanged(this, OnValueChanged);
        }
    
    
        private void OnValueChanged(object sender, EventArgs eventArgs)
        {
            if(_isUpdating) return;
            _isUpdating = true;
            var text = Text;
            if(string.IsNullOrEmpty(text)) return;
    
            Inlines.Clear();
            UpdateInlines(text);
            _isUpdating = false;
        }
    
        private void UpdateInlines(string text)
        {
            //text = @"{Customer.Panel.field}";
            var runs = new List<Run>();
            var sb = new StringBuilder();
            foreach (var current in text)
            {
                if (current.Equals('}') || current.Equals('{'))
                {
                    if (sb.Length == 0)
                    {
                        runs.Add(new Run
                        {
                            Text = current.ToString()
                        });
                    }
                    else
                    {
                        runs.Add(new Run
                        {
                            Text = sb.ToString(),
                            Foreground = Brushes.Red
                        });
                        runs.Add(new Run
                        {
                            Text = current.ToString()
                        });
                        sb.Clear();
                    }
                }
                else
                {
                    sb.Append(current);
                }
            }
            if(sb.Length > 0)
                runs.Add(new Run{Text = sb.ToString(), Foreground = Brushes.Red});
            runs.ForEach(run => 
                Inlines.Add(run));
        }
    
    
        private void OnUnloaded(object sender, RoutedEventArgs routedEventArgs)
        {
            this.Unloaded -= OnUnloaded;
            _descriptor.RemoveValueChanged(this, OnValueChanged);
        }
    
    
    }
    

    问候。