3

最近、WPF AutoCompleteBox を含む DataGridTemplateColumns で WPF Datagrid を使い始めましたが、これらの DataGridTemplateColumns に Clipboard.Paste 機能を実装する際に問題が発生しています。

Vishal のガイドhereを介して、Clipboard.Paste を組み込みの DataGridColumns で動作させることができましたが、DataGridTemplateColumns では動作しません。

DataGridColumn クラスの OnPastingCellClipboardContent メソッドを調べてみると、必要な BindingExpression ではなく、fe.GetBindingExpression(CellValueProperty) が null を返しているようです。

誰かが私を正しい方向に向けることができますか?

public virtual void OnPastingCellClipboardContent(object item, object cellContent)
    {
        BindingBase binding = ClipboardContentBinding;
        if (binding != null)
        {
            // Raise the event to give a chance for external listeners to modify the cell content
            // before it gets stored into the cell
            if (PastingCellClipboardContent != null)
            {
                DataGridCellClipboardEventArgs args = new DataGridCellClipboardEventArgs(item, this, cellContent);
                PastingCellClipboardContent(this, args);
                cellContent = args.Content;
            }

            // Event handlers can cancel Paste of a cell by setting its content to null
            if (cellContent != null)
            {
                FrameworkElement fe = new FrameworkElement();
                fe.DataContext = item;
                fe.SetBinding(CellValueProperty, binding);
                fe.SetValue(CellValueProperty, cellContent);

                BindingExpression be = fe.GetBindingExpression(CellValueProperty);

        be.UpdateSource();

    }

}

ありがとう!

4

3 に答える 3

1

ClipboardContentBinding を使用し、バインディングのモードを TwoWay に設定すると、うまくいくようです。

その後、GetBindingExpression は null 以外のもの (ClipboardContentBinding のバインディング) を返し、UpdateSource は失敗しません。

このソリューションは、ソースでトリガーされた PropertyChanged イベントがあり、それによって列の DataTemplate のコントロールが更新される場合に限定されると思います。

于 2011-10-10T02:09:51.570 に答える
0

次のように使用ClipboardContentBindingします。

<DataGridTemplateColumn 
    Header="First Name" 
    SortMemberPath="FirstName" 
    ClipboardContentBinding="{Binding FirstName}" 
    >
    <DatGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding FirstName}" />
        </DataTemplate>
    </DatGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        ...
    </DataGridTemplateColumn>
</DataGridTemplateColumn>

ここから撮影。

于 2010-09-23T20:22:33.353 に答える
0

これは、DataGridTemplateColumns にはバインディングがないためです。バインディングは、データ テンプレートで処理されます。セル データ テンプレートは、アイテム (行内のアイテム) を取得してバインドします。列がセルの内容を知る方法はありません。

独自の列を作成することで、これを回避しました。DataGridTextColumn から派生し (テキスト入力がある場合)、GenerateElement と GenerateEditingElement をオーバーライドします。

このようにして、貼り付けに使用できるバインディング プロパティがまだあります。

于 2010-04-12T23:21:44.717 に答える