web-dev-qa-db-ja.com

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列を例にとると、これはDataGridTemplateColumnです(そこには画像とその他の要素が含まれているため)。したがって、実際には 'Name'プロパティにバインドされていません...しかし、上記のコードが機能するようにしたいのですが。

私の質問は2部構成です。

  1. 上記のコードが機能するように、DataGridTemplateColumnをBOUNDにすることは可能ですか?どういうわけかそれをプロパティにバインドできますか?

  2. または、完全に異なる何かをする必要があり、上記のコードを変更しますか?

前もって感謝します!

AT

19
Andy T

テンプレート列をバインドすることはできませんが、その列に保持されているコントロールの1つをバインドできます。これは私が同様の問題をどのように解決したかです:

_<DataGridTemplateColumn Header="ColumnHeader">
     <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
                 <local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/>
           </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
_

最初の例を正しく理解していれば、これはGroupByField_Click()メソッドのロジックを変更して、送信列がテンプレート列であるかどうかを確認し、そこに含まれる要素を調べてBindingオブジェクトを取得することを意味します。

32
rankAmateur

私にとって、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
3
slavica

トリッキーです。祖父母の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>
2
Gopinath

dgbc.ClipboardContentBinding;を使用できます

1
Orlangoor
  1. いいえ、DataGridTemplateColumnDataGridBoundColumnを継承しないため、DataGridBoundColumnへのキャストは失敗します。
    上記のコードを機能させるには、すべての列がDataGridBoundColumn抽象クラスから継承する必要があります。そのため、DataGridTemplateColumnの代わりにカスタム派生列クラスを作成することで機能するはずです。

  2. あなたは単に

    Dictionary<DataGridColumn, string> BoundPropName;

    初期化してから

    var propName = BoundPropName[dgch.Column]

0
majocha