1

正しく並べ替えられていないデータを表示する複数のリストボックスとコンボボックスを含む Silverlight アプリケーションがあり、これを修正する必要があります。それらの ItemSource プロパティのほとんどは、XAML を通じて設定されます。それらの DataContext は、コントロールに直接設定されていない可能性があり、代わりに親に設定されていました。したがって、コード ビハインドで ItemSource または DataContext の割り当てに「OrderBy」を簡単に平手打ちすることはできません。その割り当てが明示的に存在しない可能性があるためです。

そこで、「プロキシ」コレクションを作成するというアイデアがありました。プロキシ コレクションは元の ItemSource を取得し、並べ替えられたバージョンを公開します。私はこれを変換することができます:

<ListBox ItemsSource="{Binding}"/>

これに:

<ListBox>
    <ListBox.ItemsSource>
        <my:ProxyCollection Source="{Binding}" SortBy="Name"/>
    </ListBox.ItemsSource>
</ListBox>

汚すぎる格好はやめて!しかし、ProxyCollection は ListBox の子ではないため、ListBox の DataContext はそれに伝達されず、バインディングは魔法のようには機能しません。ProxyCollection コレクションの DataContext を手動で設定すると、うまく機能します。ただし、DataContext を手動で設定する必要がある場合は、プロキシ コレクションを削除し、Listbox の DataContext を手動で設定して、「OrderBy」を追加することもできます。

では、プロキシ コレクションに設定された ListBox の DataContext を自動的に取得する方法についてのアイデアはありますか? または他の天才的なアイデアはありますか?

4

4 に答える 4

1

私は非常によく似た問題に出くわしました。コードなしという同じ設計目標で、あるコンボボックスから後続のコンボボックスにパラメータをカスケードしたかった....

私のソリューションはほとんどエレガントではありませんが、ファッションで機能します:)

基本的に、私は SharedDataContext コントロールを持っています。これには、データコンテキストに直接バインドする「値」DP があります。

次に、共有データ コンテキストで添付プロパティを使用して、他の要素を登録できるようにします。

これにより、XAML は次のようになります。

<my:SharedDataContext Value="{Binding}" />
<ComboBox>
    <ComboBox.ItemsSource>
       <my:ProxyCollection my:SharedDataContext.Register="1" />    
    </ComboBox.ItemsSource>
</ComboBox>

SharedDataContext 内には、フレームワーク要素の静的コレクションがあります。

Register 添付プロパティが「変更」されると、PropertyChangedCallback をキャッチし、送信者 (この場合は ProxyCollection インスタンス) をコレクションに追加します。

データ バインディングが変更された場合 (つまり、SharedDataContext の Value プロパティが変更された場合)、コレクションを列挙してデータ バインディングを設定します。

これはまだ進行中の作業であり、まだ 100% 満足しているわけではありません (コレクションをクリーンアップすることなど、少し心配です) が、いくつかのアイデアが得られることを願っています。

HTH

サイモン

于 2009-07-29T11:47:51.780 に答える
0

私は別のルートから問題に取り組むことになりました。たとえば、標準の ComboBox から派生した「SortedComboBox」コントロールを作成しました。独自の ItemSource を定義し、その ItemsSource が変更されると、アイテムを並べ替えてから、基本クラスに ItemsSource を設定します。十分に機能し、XAML を少し変更するだけで目的の効果が得られます

于 2009-07-29T15:43:48.890 に答える
0

データ コンテキストが親で設定されている場合、リスト ボックスがデータ コンテキストとして設定されているクラスのプロパティにバインドされている場合、そのプロパティは get / set として公開され、意図的にプロパティからデータを出力できます。ソートされた方法で。

ただし、MVVM タイプのシナリオでは、VM を消費するビューの並べ替え順序が決定されるため、理想的ではありません。

于 2009-07-15T20:56:35.957 に答える
0

IValueConverter を使用して、順序付けられていないリストを順序付けられたリストに変換できます。converter パラメータを使用して、順序付け方法を指定できます。

簡単で、クリーンで、MVVM フレンドリーで、任意のコントロールにバインドされた任意のコレクションに使用できます:)

于 2010-12-09T17:51:42.637 に答える