特定の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
列を例にとると、これはDataGridTemplateColumn
です(そこには画像とその他の要素が含まれているため)。したがって、実際には 'Name'プロパティにバインドされていません...しかし、上記のコードが機能するようにしたいのですが。
私の質問は2部構成です。
上記のコードが機能するように、DataGridTemplateColumn
をBOUNDにすることは可能ですか?どういうわけかそれをプロパティにバインドできますか?
または、完全に異なる何かをする必要があり、上記のコードを変更しますか?
前もって感謝します!
AT
テンプレート列をバインドすることはできませんが、その列に保持されているコントロールの1つをバインドできます。これは私が同様の問題をどのように解決したかです:
_<DataGridTemplateColumn Header="ColumnHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
_
最初の例を正しく理解していれば、これはGroupByField_Click()
メソッドのロジックを変更して、送信列がテンプレート列であるかどうかを確認し、そこに含まれる要素を調べてBindingオブジェクトを取得することを意味します。
私にとって、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
トリッキーです。祖父母のUserControl(UserControl内にDataGridがありました)にトラバースすることでバインディングを実現し、UserControlはPresenter(この場合はモデル)にバインドされました。以下のコードで、DataGridTemplateColumn内に配置されたAutoCompleteBoxのSelectedItemプロパティを確認します。
<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>
dgbc.ClipboardContentBinding;
を使用できます
いいえ、DataGridTemplateColumn
はDataGridBoundColumn
を継承しないため、DataGridBoundColumn
へのキャストは失敗します。
上記のコードを機能させるには、すべての列がDataGridBoundColumn
抽象クラスから継承する必要があります。そのため、DataGridTemplateColumn
の代わりにカスタム派生列クラスを作成することで機能するはずです。
あなたは単に
Dictionary<DataGridColumn, string> BoundPropName;
初期化してから
var propName = BoundPropName[dgch.Column]