【问题标题】:Expose ToolTip DependencyProperty on custom DataGridTextColumn在自定义 DataGridTextColumn 上公开 ToolTip DependencyProperty
【发布时间】:2014-09-10 18:07:44
【问题描述】:

我知道我可以设置列的样式并以这种方式设置工具提示,但我希望在网格列上有一个真正的工具提示属性。 在创建文本块之前,我无法公开它的工具提示属性。 这是我的自定义列。

public class DataGridTextColumn : System.Windows.Controls.DataGridTextColumn
{
    public static readonly DependencyProperty TextTrimmingProperty = DependencyProperty.Register(
        "TextTrimming", typeof (TextTrimming), typeof (DataGridTextColumn),
        new PropertyMetadata(default(TextTrimming)));

    /// <summary>
    ///     HorizontalAlignment Dependency Property.
    /// </summary>
    public static readonly DependencyProperty HorizontalAlignmentProperty =
        DependencyProperty.Register(
            "HorizontalAlignment",
            typeof (HorizontalAlignment),
            typeof (DataGridTextColumn),
            new FrameworkPropertyMetadata(HorizontalAlignment.Left, FrameworkPropertyMetadataOptions.AffectsArrange), ValidateHorizontalAlignmentValue);

    public DataGridTextColumn()
    {
        ElementStyle = Application.Current.Resources["DataGridTextStyle"] as Style;
        EditingElementStyle = Application.Current.Resources["DataGridEditingTextStyle"] as Style;
    }

    /// <summary>
    ///     TextTrimming, only works in read-only mode
    /// </summary>
    public TextTrimming TextTrimming
    {
        get { return (TextTrimming) GetValue(TextTrimmingProperty); }
        set { SetValue(TextTrimmingProperty, value); }
    }

    /// <summary>
    ///     HorizontalAlignment Property.
    /// </summary>
    public HorizontalAlignment HorizontalAlignment
    {
        get { return (HorizontalAlignment) GetValue(HorizontalAlignmentProperty); }
        set { SetValue(HorizontalAlignmentProperty, value); }
    }

    internal static bool ValidateHorizontalAlignmentValue(object value)
    {
        var ha = (HorizontalAlignment) value;
        return (ha == HorizontalAlignment.Left
                || ha == HorizontalAlignment.Center
                || ha == HorizontalAlignment.Right
                || ha == HorizontalAlignment.Stretch);
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var element = (TextBlock) base.GenerateElement(cell, dataItem);
        element.TextTrimming = TextTrimming;
        element.HorizontalAlignment = HorizontalAlignment;
        return element;
    }

工具提示必须附加到文本块。

【问题讨论】:

    标签: wpf wpfdatagrid


    【解决方案1】:

    是你想要的吗:

    element.ToolTip = new ToolTip { Content = new TextBlock { Text = "Da Tooltip!" } };
    

    ?...

    【讨论】:

    • 语法不错,但问题是tooltip属性的绑定没有发生,tooltip为null。我需要设置新元素和工具提示之间的绑定
    • 也许我应该自己回答这个问题,但这是有效的gist.github.com/Martin-Andersen/…
    • 是的,您可以回答自己的问题。 :)
    【解决方案2】:

    我自己回答这个问题是因为我认为我的发现真的很有帮助。 我需要一种将工具提示绑定到 DataGridTextColumn 的方法,因此我反向设计了 Binding 属性。这是我的工具提示代码:

    public BindingBase ToolTip
        {
            get { return _toolTip; }
            set
            {
                if (_toolTip == value) return;
                _toolTip = value;
                NotifyPropertyChanged("ToolTip");
    
            }
        }
    

    以及 GenerateElement 的覆盖

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            var element = (TextBlock) base.GenerateElement(cell, dataItem);
            element.TextTrimming = TextTrimming;
            element.HorizontalAlignment = HorizontalAlignment;
            ApplyToolTipBinding(element, FrameworkElement.ToolTipProperty);
            return element;
        }
    

    其余代码可以在this gist 找到。通过用我的自定义列替换模板列,我已经能够删除很多米的 XAML 代码。您可以直接在 DataGridTextColumn 上设置 ToolTip、TextTrimming 和 Horizo​​ntalAlignment。

    我希望你会发现代码有用。

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多