1

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

私は "プロキシ"コレクションを作成する考えがありました。プロキシコレクションは元のItemSourceを取得し、ソートされたバージョンを公開します。

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

ない、あまりにもみすぼらしい:このに

<ListBox ItemsSource="{Binding}"/> 

:私は、これを変換することができるだろう!しかし、ProxyCollectionはListBoxの子ではないので、ListBoxのDataContextはそれに伝播せず、バインディングは魔法のように動作しません。私が手動でProxyCollectionコレクションのDataContextを設定するとうまくいきます。しかし、手動でDataContextを手動で設定する必要がある場合は、プロキシコレクションを削除し、リストボックスのDataContextを手動で設定して、 "OrderBy"を追加することもできます。

私は自動的にListBoxのDataContextをプロキシコレクションに設定する方法について考えていますか?または他の天才のアイデア?

答えて

0

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

MVVMタイプのシナリオでは、VMを消費することを非常によく見せるようにソート順を指定するのは理想的ではありません。

1

私は非常に似た問題を偶然見つけました。私は、私の解決策はほとんどエレガントですが、それはファッションの作品

....ノーコードの同じ設計目標とその後のコンボボックスに1つのコンボボックスからパラメータをカスケード接続したい:)

基本的に私が持っていますSharedDataContextコントロールでは、これはdatacontextに直接バインドする "Value" DP iを持っています。

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

これはSharedDataContextインサイドこの

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

のようなXAMLを見て私は、フレームワーク要素の静的なコレクションを持っています。

Register添付プロパティが "変更された"とき、私はPropertyChangedCallbackを捕捉し、送信者(この場合はProxyCollectionインスタンス)をコレクションに追加します。

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

これは少し作業が進んでいますが、私は100%満足していません(コレクションのクリーンアップなどは少し気になります)。

HTH

サイモン

0

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

0

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

MVVMは簡単で清潔で、任意のコントロールにバインドされたコレクションに使用できます。

関連する問題