2

繰り返し発生する問題は、データグリッド用の拡張テキスト列を作成する必要があることです。これは、通常のテキスト列と同じように機能する列を意味しますが、テキストの横に表示される画像のような追加のグラフィックまたは機能を備えています。だから私はテンプレート列を使用していますが、これは明らかに、テキストボックス編集テンプレートなど、通常のテキスト列に期待される多くの機能を生成する際に「ゼロから始める」必要があることを意味します:

<DataGridTemplateColumn.CellEditingTemplate>
         <DataTemplate>
              <TextBox 
                   FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 
                    Text="{Binding Path=[binded text], Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

DataGridTemplateColumn から継承された列を定義し、このコードをすべてそこにダンプして、これらの列を必要なデータグリッドで再利用できるようにしたいと考えています。しかし、上に示したように、クラス定義でバインディングを宣言することはできません。これは明らかに使用法に依存するためです。

子コントロール (この場合は特にセル編集テキスト ボックス) を使用する継承されたデータグリッド列を定義するにはどうすればよいですか?ただし、列が実際のデータグリッド内で xaml で宣言されている場合でも、これらのコントロールにバインドを設定できますか?

これまでのところ、これを行うメソッドを公開しようとしましたが、機能していません:

Public Class MyTextColumn
Inherits DataGridTemplateColumn
....
Public Property EditorBinding As String
    Get....
    Set(value As String)
        Dim b As New Binding(value)
        b.Mode = BindingMode.TwoWay
        b.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus
        Dim tb = DirectCast(Me.CellEditingTemplate.LoadContent, TextBox)
        tb.SetBinding(TextBox.TextProperty, b)
    End Set
End Property

動作していません。おそらく を設定していませんBinding.Sourceが、何を設定すればよいかわかりません。かなりイライラしています。

4

1 に答える 1

0

したがって、私があなたを正しく理解していれば、TextBox のテキスト プロパティを、この子コントロールを保持する親コントロール上の何かにバインドできるようにしたいと考えています。通常のプロパティを使用してそれを行うことはできません(「依存関係プロパティではないためバインドできません」という例外または同様の例外が発生したと思います)。

これは、私が通常問題なく行う方法です。まず、コード ビハインドで依存関係プロパティを定義する必要があります。これは、VB.net でそれを行う方法を示しているはずです (私は VB.net が本当に苦手なので、それについてアドバイスするつもりはありません)。VB.net の最初の例を確認してください。最初に変更する必要があるのは、ブール値から文字列への変更です。おそらく、プロパティ名も変更する必要があります。名前の「Property」の部分を例の位置に残すように注意してください。GetType(MyCode)依存関係プロパティを実装しているクラスの名前 (クラスの名前) に変更する必要がありますMyTextColumn

MyTextColumn xaml では、次のようになります。

<DataGridTemplateColumn.CellEditingTemplate>
         <DataTemplate>
              <TextBox 
                   FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 
                    Text="{Binding Path=IsSpinning, RelativeSource={RelativeSource AncestorType=DataGridTemplateColumn}, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

元のプロパティ名 IsSpinning を付けました。選択した名前をそこに付けてください。また、基本クラスが DataGridTemplateColumn でない場合は、相対ソースを修正する必要がある場合があります。これは、カスタム コントロールに来るものをすべてピックアップする必要があります。

最後のステップは、コントロールを使用することです。

<controls:MyTextColumn IsSpinning="{binding PropName}"/>

基本的に、必要な文字列にバインドします。私の説明やコードで発生する可能性のある問題を自由に書き留めてください。それに応じて回答を修正します。

于 2013-10-02T14:49:50.800 に答える