0

さっそく話してみましょう。次のように、いくつかの列が設定された DataGrid があります。

<ctrl:DataGridWithFooter 
      FooterRowsCount="1" 
      x:Name="MyGrid" 
      CanUserDeleteRows="False" 
      CanUserSortColumns="True"
      AutoGenerateColumns="False" 
      ItemsSource="{Binding Path=Model, UpdateSourceTrigger=PropertyChanged}" 
      IsEnabled="{Binding Path=Idle}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Level" 
                                        Binding="{Binding Path=Name, Mode=OneWay}" />
<!--Snip-->
</ctrl:DataGridWithFooter>

そして期待通りのモデル。ただし、アプリケーションが実行されると、モデル内のリスト内の要素を反映する新しい列を追加する状況があるため、次のようなバインディング式を取得します

<DataGridTextColumn Binding="{Binding Path=Attributes[0]}" />

または似たようなもの。表示と並べ替えはそれ自体で問題ありませんが、合計の行を一番下に強制する必要があるという問題に遭遇しました。これを正常に機能させるには、オンラインで見つけたコードを少し使用する必要がありました (ここで入手可能)。 、宣伝どおりに動作します)。しかし、この新しいカスタマイズされた DataGrid クラスのソート クラスが、私のリスト要素バインディングでクラッシュすることがわかりました。私の質問は、このコンストラクターをどのように変更するかです

public PropertyAccessor(Type targetType, string property) {
    IsList_ = false;
    mTargetType = targetType;
mProperty = property;

    PropertyInfo propertyInfo =
        targetType.GetProperty(mProperty);

    mCanRead = propertyInfo.CanRead;
    mCanWrite = propertyInfo.CanWrite;
    mPropertyType = propertyInfo.PropertyType;
}

すべての情報を取得するには、リスト要素を反映して並べ替える必要がありますか?

4

1 に答える 1

0

私のサンプル (私のブログです) を使用していただいたことを嬉しく思います。これを実現する方法の 1 つは、特定の属性のパブリック ゲッターを作成することです。あまり便利ではないかもしれません。Cuz PropertyAccessorにはプロパティが必要です。または、「属性[0]」を解析して、最初にプロパティの値を取得し、インデックス[0]の要素を取得することもできます

また、このタスク用に別のソリューションを作成することにしました。主なアイデアは、データグリッドのラッパーを作成することです。一般的には次のようになります。

<StackPanel>
    <DataGrid/>
    <Footer/>
</StackPanel>

フッターは、テキスト ボックスを含むグリッドです (複数の行を含めることができます)。この Grid の列DataGridの列と同期されます。また、セルを結合してフッターを作成することもできます。このソリューションでは、並べ替えのために移動する必要はありません。それはDataGridによって達成されます。

これがどのように見えるかです。少し後でブログでコードを共有します。ブログから連絡できます。

于 2012-08-10T06:11:21.973 に答える