2014-09-10 82 views
1

我知道我可以設置該列的樣式並設置工具提示,但我希望在網格列上具有真實的tooltip屬性。 我在創建文本塊之前無法暴露文本塊的工具提示屬性。 這是我的自定義列。在自定義DataGridTextColumn上公開ToolTip DependencyProperty

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; 
    } 

工具提示必須附加到文本塊。

回答

0

難道你想要什麼?

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

...

+0

不錯的語法,但問題在於未發生工具提示屬性的綁定,工具提示爲空。我需要設置新元素和工具提示之間的綁定 – 2014-09-11 06:43:39

+0

也許我應該自己回答,但這是工作https://gist.github.com/Martin-Andersen/d801bde4987ef2ce1bec#file-datagridtextcolumn – 2014-09-11 07:32:51

+0

是的,你可以回答你的自己的問題。 :) – Pragmateek 2014-09-11 09:41:19

0

我回答這個問題我自己,因爲我認爲我的研究結果可以是很有益的。 我需要一種方法將工具提示綁定到DataGridTextColumn,所以我顛倒了工程設計的Binding屬性。這是我的工具提示代碼:

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

     } 
    } 

和代碼的其餘部分可以在this gist找到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; 
    } 

的覆蓋。我已經能夠通過用我的自定義列替換模板列來移除許多米的XAML代碼。您可以直接在DataGridTextColumn上設置ToolTip,TextTrimming和Horizo​​ntalAlignment。

我希望你能找到有用的代碼。

相關問題