[英]How to set the enable property of a programmatically generated ComboBox in a Datagrid in WPF ?
[英]How To Set WPF DataGrid TextTrimming Property Programmatically
我有一些WPF DataGrid
,它們在C#代碼中的樣式非常好,如下所示。 TextAlignment
, TextWrapping
和ToolTip
都可以正常工作。 但是,我無法顯示省略號TextTrimming
。 你能告訴我我在做什么錯嗎?
public static void FormatGrid(ref DataGrid oDataGrid, List<ColumnFormat> oColumnFormats)
{
oDataGrid.CanUserResizeColumns = true;
SetHighlightBrush(ref oDataGrid, oUser);
oDataGrid.Background = GetBackgroundBrush(oUser);
oDataGrid.Foreground = GetBrushForeground(oUser, ColorType.Medium);
for (int iColumn = 0; iColumn < oDataGrid.Columns.Count; iColumn++)
{
DataGridColumn oColumn = oDataGrid.Columns[iColumn];
ColumnFormat oColumnFormat = GetColumnFormat(oColumn);
if (oColumn.Visibility == Visibility.Visible)
{
if (oColumnFormat != null)
{
oColumn.CellStyle = GetCellStyle(oColumnFormat.ColumnName);
}
}
}
}
private static Style GetCellStyle(string sToolTipPath)
{
Style oCellStyle = new Style(typeof(DataGridCell));
SetterBaseCollection oSetters = GetStyleSetters(sToolTipPath);
foreach (Setter oSetter in oSetters)
{
oCellStyle.Setters.Add(oSetter);
}
return oCellStyle;
}
private static SetterBaseCollection GetStyleSetters(string sToolTipPath)
{
SetterBaseCollection oSetters = new SetterBaseCollection();
Setter oTextAlignment = new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Left);
oSetters.Add(oTextAlignment);
Setter oTextWrapping = new Setter(TextBlock.TextWrappingProperty, TextWrapping.NoWrap);
oSetters.Add(oTextWrapping);
Setter oTextTrimming = new Setter(TextBlock.TextTrimmingProperty, TextTrimming.CharacterEllipsis);
oSetters.Add(oTextTrimming);
Setter oToolTip = new Setter(TextBlock.ToolTipProperty, new Binding(sToolTipPath));
oSetters.Add(oToolTip);
return oSetters;
}
我無法確切地告訴您問題的原因是什么,除了出於任何XYZ原因,TextTrimming似乎都是特例。 即使嘗試通過XAML進行設置,它也可以在我的自定義DataGrid CellStyle中工作:
<Setter Property="TextBlock.Foreground" Value="Red"/>
雖然這不是:
<Setter Property="TextBlock.TextTrimming" Value="CharacterEllipsis"/>
長話短說,我有一個類似的問題,可能是您通過CodeBehind進行適應的解決方案。 它要求覆蓋DataGrid的AutoGeneratingColumn事件,然后使用自定義列在元素生成時設置TextTrimming屬性。 奇跡般有效。 這是一些應該使您入門的快速偽代碼(在VB中,我很抱歉!):
Private Sub CustomDataGrid_AutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs) Handles Me.AutoGeneratingColumn
e.Cancel = True
Dim binding As New Binding
Dim textColumn = TryCast(e.Column, DataGridTextColumn)
If textColumn IsNot Nothing Then
binding = textColumn.Binding
binding.TargetNullValue = "-"
End If
Columns.Add(New CustomColumn() With {.Header = e.Column.Header, .Binding = binding})
End Sub
...
Public Class CustomColumn
Protected Overrides Function GenerateElement(cell As DataGridCell, dataItem As Object) As FrameworkElement
Dim block As New TextBlock()
Dim column As CustomColumn = DirectCast(cell.Column, CustomColumn)
Dim binding As Binding = DirectCast(column.Binding, Binding)
If binding IsNot Nothing Then
Dim cellBinding As New Binding(binding.Path.Path)
cellBinding.Source = dataItem
cellBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
cellBinding.ValidatesOnDataErrors = True
cellBinding.ValidatesOnExceptions = True
cellBinding.NotifyOnValidationError = True
cellBinding.ValidatesOnNotifyDataErrors = True
cellBinding.Mode = BindingMode.OneWay
block.SetBinding(TextBlock.TextProperty, cellBinding)
block.TextTrimming = TextTrimming.CharacterEllipsis
End If
Return block
End Function
End Class
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.