7

数値コンテンツで列を並べ替えようとしています。マルチバインディングコンバーターは正常に動作します。このソリューションは、SortMemberPathをnullに設定します

私はさまざまな方法を試し、インターネットを大幅に調べました。

セキュリティ上の理由から、コードは元のコードから変更されています。

<DataGridTemplateColumn x:Name="avgPriceColumn">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource avgPriceConverter}">
                    <Binding Path="NumberToDivideBy" />
                    <Binding Path="TotalDollars" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.SortMemberPath>
    <MultiBinding Converter="{StaticResource avgPriceConverter}">
        <Binding Path="NumberToDivideBy" />
        <Binding Path="TotalDollars" />
    </MultiBinding>
</DataGridTemplateColumn.SortMemberPath>
</DataGridTemplateColumn>

編集:マルチバインディングなしでデータバインディングを機能させる方法を見つけましたが、並べ替えはまだ機能しません。DataGridはカスタムクラスにバインドされているため、値全体を取り込んでそこから変換し、MultiBindingの必要性を減らします。

<DataGridTextColumn x:Name="avgPriceColumn" Binding="{Binding Converter={StaticResource avgPriceConverter}}" SortMemberPath="{Binding Converter={StaticResource avgPriceConverter}}" />

これらのオプションの両方で、SortMemberPathはデフォルトでBindingに設定されているため、明示的に定義する必要はありません。

ただし、これにより、SortMemberPath値がnullに設定され、コード環境に適用可能なカスタム制約と競合し、ソートされなくなります。だから私はまだより良い解決策に興味があります。

編集:

競合するコードを他の場所で変更して、SortMemberPathの重複を許可し、一部の列での並べ替えをサポートせず、一部の隣接する列の値を並べ替える

4

1 に答える 1

8

SortMemberPathは、個々の計算された行の値ではなく、プロパティの名前( "TotalDollars"など)を期待しています。ヘッダーのように考えて、列全体に1回設定します。コンバーターは、SortMemberPathがバインディングパス文字列を必要とする15のような数値を返します。

頭に浮かぶ2つのオプション:

  1. バッキングオブジェクトに計算されたプロパティ(「AveragePrice」など)を提供し、それにバインドします。コンバーターやソートメンバーのパスは必要ありません。

    public double AveragePrice
    {
        get { return TotalDollars / NumberToDivideBy; }
    }
    
  2. この質問のようにOnSortingイベントハンドラーを指定します。

それが役に立てば幸い。:)

于 2013-03-22T10:43:41.530 に答える