1

要素のプロパティではなく、コレクション内に格納されているいくつかのプロパティをバインドしようとしているときに混乱しました。私はそれを正しく表現する方法さえわかりません...コードはよりよく説明するかもしれません:ここにタイプがあります(実際のコードではなく、私はそれを基本に短縮しました):

public class myType
{
    public int P {get;set;}
}
public class myTypeCollection : ObservableCollection<myType>
{
    public int Ptotal {get { return this.Items.Select(i=>i.P).Aggregate((c,t)=>t = t + c); }}
    public int Pmin { get { this.Items.Min(i => i.P); } } //concept
    public int Pmax { get { this.Items.Max(i => i.P); } } //concept
}

これらはテンプレート化されたコントロールで使用されており、そのXAMLは次のようになります:(コメントを追加して、できる限り明確にします)

<!-- myGridObject = new myTemplatedControl(); -->
<!-- myGridObject.DataContext = new myTypeCollection(); -->
<!-- NOTE: collection obviously is NOT empty in the real code -->
<sdk:DataGrid ItemsSource={Binding DataContext}> 
    <sdk:DataGridTemplateColumn Width="Auto">
        <sdk:DataGridTemplateColumn.HeaderStyle>
            <Style TargetType="sdk:DataGridColumnHeader">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>

                            <!-- ?????? write out Ptotal in the header of the column ??????? -->
                            <!-- This throws a binding-related ArgumentException -->
                            <TextBlock Text="{Binding ???? Ptotal ?????}" />

    <!-- closing tags cut off -->
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding P}" />
    <!-- closing tags cut off once more-->

{Binding P}はアイテムのプロパティであるため、期待どおりに機能しますが、、などのPコレクションのプロパティにアクセスするにはどうすればよいですか?PtotalPmin

これをお読みいただきありがとうございます。不足している情報がある場合は、それを指摘して投稿します。

4

3 に答える 3

0

したがって、バインディングソースとしてコレクションオブジェクトが必要です。

これらが必要です:

RelativeSource MarkupExtension

Binding.RelativeSourceプロパティ

このようなもの(テストされていません):

    <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type myTemplatedControl}}, Path=DataContext.Ptotal}" />

DataGridがカスタム内にある場合myTemplatedControl。myGridObjectが正確に何であるかは私には完全には明らかではありません。主なアイデアは次のとおりです。

MSDNのドキュメントにあるように:Binding.RelativeSourceGets or sets the binding source by specifying its location relative to the position of the binding target.

x:Type拡張機能を使用している場合は、これに関するリンクがあります。カスタムコントロールで使用できます。

X:タイプ

別のアプローチは、コンテナ要素(コレクションはデータコンテキスト)に名前を付ける場合、その要素をバインディングソースとして設定できます。

<TextBlock Text="{Binding ElementName=yourElementName, Path=DataContext.Ptotal}" />
于 2012-04-18T14:10:59.033 に答える
0

問題は、DataGridがコレクションにバインドされており、各行がコレクションではなく個々のアイテムにバインドされていることだと思います。チェーンの1つ上のレベル(コレクション自体に戻る)にアクセスする必要があります。

Silverlight 4以降を実行している場合は、relativesourceを使用できます。例えば:

<TextBlock Text="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType=sdk:DataGrid, AncestorLevel=1}, Path=DataContext.Count}"

それ以外の場合は、コンテキストへの静的アクセスを作成して、バインディングを介してアクセスしますSource

于 2012-04-18T14:12:23.380 に答える
0

顧客がグリッドヘッダーについて考えを変えたことが判明しました。彼は、ヘッダーに合計が表示されることをもう望んでいません。

ちなみに、私はさまざまなタイプのコンバーターでのパッチ適用を含む20の異なるアプローチを試したに違いありませんが、この見た目ほど単純ではないタスクを実行できませんでした。

それでもなお興味深い提案をありがとう。

于 2012-04-23T08:53:21.023 に答える