WPF - Как связать DataGridTemplateColumn
Я пытаюсь получить имя свойства, связанного с конкретным DataGridColumn
, чтобы затем я мог делать некоторые вещи на основе этого. Эта функция вызывается, когда пользователь нажимает элемент контекстного меню на заголовке столбца...
Это хорошо для готовых готовых типов столбцов типа DataGridTextColumn
, поскольку они связаны, но проблема в том, что некоторые из моих столбцов DataGridTemplateColumns
, которые не связаны.
private void GroupByField_Click (object sender, RoutedEventArgs e){
MenuItem mi = (MenuItem)sender;
ContextMenu cm = (ContextMenu) mi.Parent;
DataGridColumnHeader dgch = (DataGridColumnHeader) cm.PlacementTarget;
DataGridBoundColumn dgbc = (DataGridBoundColumn) dgch.Column;
Binding binding = (Binding) dgbc.Binding;
string BoundPropName = binding.Path.Path;
//Do stuff based on bound property name here...
}
Итак, возьмите, например, мой столбец Name
... it a DataGridTemplateColumn
(так как у него есть изображение и некоторые другие вещи там). Поэтому он фактически не связан с свойством "Имя"... но я хотел бы быть таким, чтобы этот код работал.
Мой вопрос - двухчастный, действительно:
-
Можно ли сделать DataGridTemplateColumn
BOUND, чтобы приведенный выше код работал? Можно ли каким-либо образом привязать его к свойству?
-
Или мне нужно что-то совершенно другое и изменить код выше?
Спасибо заранее!
в
Ответы
Ответ 1
Хотя вы не можете привязать столбец шаблона, вы можете связать один из элементов управления, хранящихся в этом столбце. Вот как я решил аналогичную проблему:
<DataGridTemplateColumn Header="ColumnHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Если я правильно понял исходный пример, это означало бы изменение логики метода GroupByField_Click()
, чтобы проверить, является ли столбец отправки столбцом шаблона, а затем просматривает элементы, которые он содержит для получения объекта Binding.
Ответ 2
Это сложный вопрос. Мы достигли привязки, перейдя к его прародителю UserControl (у нас был DataGrid внутри UserControl), и UserControl был связан с Ведущим (модель в нашем случае).
В приведенном ниже коде проверьте свойство SelectedItem из AutoCompleteBox, помещенное внутри DataGridTemplateColumn.
<wpfToolkit:DataGridTemplateColumn Header="{x:Static resources:Store.ItemNameC}" Width="0.60*">
<wpfToolkit:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<extended:HOAutoCompleteBox
IsTextCompletionEnabled ="True"
x:Name="ItemAutoCompleteBox"
Populating="ItemAutoCompleteBox_Populating"
DefaultType="HealthObject.ObjectModel.pSearchStockItemResult,HealthObject.ObjectModel"
Text="{Binding Path= ItemName, Mode=TwoWay}"
<!--- **** HERE IS THE BINDING SAMPLE *****-->
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Model.SelectedStockItem, Mode=TwoWay}">
</extended:HOAutoCompleteBox>
</DataTemplate>
</wpfToolkit:DataGridTemplateColumn.CellEditingTemplate>
</wpfToolkit:DataGridTemplateColumn>
Ответ 3
Для меня ClipboardContentBinding
of DataGridTemplateColumn
является решением:
Private Function FindBoundProperty(ByVal col As DataGridColumn) As String
Dim boundColumn As DataGridBoundColumn = TryCast(col, DataGridBoundColumn)
Dim boundPropertyName As String = ""
Dim binding As Binding
If col.DependencyObjectType.Name = "DataGridTextColumn" Then
binding = TryCast(boundColumn.Binding, Binding)
boundPropertyName = binding.Path.Path
End If
If col.DependencyObjectType.Name = "DataGridTemplateColumn" Then
binding = TryCast(col.ClipboardContentBinding, Binding)
boundPropertyName = binding.Path.Path
End If
Return boundPropertyName
End Function
Ответ 4
Вы можете использовать
dgbc.ClipboardContentBinding;
Ответ 5
-
Нет, потому что DataGridTemplateColumn
не наследует от DataGridBoundColumn
, поэтому сбрасывание в DataGridBoundColumn
завершится неудачно.
Чтобы сделать работу над кодом, все ваши столбцы должны наследоваться от абстрактного класса DataGridBoundColumn
. Поэтому выполнение пользовательских классов столбцов вместо DataGridTemplateColumn
должно работать.
-
Вы можете просто заполнить
Dictionary<DataGridColumn, string> BoundPropName;
при инициализации, а затем do
var propName = BoundPropName[dgch.Column]