WPFデータ型を使用して1つのListBoxに2つのコレクションのアイテムを表示する

テキストと画像を1つのアイテムとして表示するリストボックスを作成しようとしています。リストボックスの項目には、画像のテキストとIDがあります。イメージIDは、イメージURIのコンテナを取得するためにLINQ式で使用できます。

基本的に、私は2つのリストを持っています。最初のリストの各項目は、2番目のリストの特定の項目を取り出すためのキーです。どちらのデータを1つのリストボックスに表示するには?

クラリティを編集する:

最初のリストはメッセージオブジェクトの集合です - ObservableCollection:

class Message
{
    public String PosterID { get; set; }
    public String Text { get; set; } //this isn't important, it is the message body
}

2番目のリストは、ObservableCollectionというユーザープロファイルのコレクションです。

class User
{
    public String UserID { get; set; }
    public String ProfilePictureURI { get; set; }
}

メッセージのポスターのプロファイルデータを取得するには、 'Message.PosterID'を 'User.UserID'と一致させるために 'key'として使用する必要があります。

問題のリストボックスは、現在ViewModel.Messagesにバインドされています。リストボックスのデータテンプレートでは、 'Message.Text'が正常に印刷されますが、まだ 'User.ProfilePictureURI'を取得する必要があります。

ValueConverterを使用して 'Message.PosterID'を 'User.UserID'に変換することをお勧めします。しかし、この変換を行うには、ViewModel.UsersをValueConverterに渡す必要があります。私は現在、これを行う方法を知らない。

0
最初と2番目のリストには何が入っていますか?あなたのテキストは最初のリストにあり、イメージは2番目のリストにありますか?
追加された 著者 Mohammad Dehghan,
最初のリストの各要素には「Text」と「ImageID」の各プロパティがあります。 2番目のリストの要素には、「ImageID」および「ImageURI」プロパティがあります。
追加された 著者 FZdev,

1 答え

あなたは2つの方法があると思います:

A.バインディングコンバータを使用して、イメージIDを2番目のリストから検索し、ListBoxをリストにバインドして変換します。

B.データのViewModelとして機能するラッパークラスを作成し、ListBoxをViewModelオブジェクトにバインドします。

EDIT
About using the value converter:
If you could make the Users list static or use some Dependency Injection mechanism to obtain the Users list, then your value converter could easily do the conversion.
The only other way is somehow pass the Users list from ViewModel (DataContext) to the binding converter.
At first I thought that you can set the Users to a property of the converter, like this:


    
        
    
...

または、 ConverterParameter としてバインディングに渡します。


しかし、DataContextから Users プロパティを取得する方法はありますか?上記の2つのオプションのいずれかで、これを(間違った)ように Users にプロパティをバインドできるはずです:


しかしPosterIDConverterはDependencyObjectではなく、データバインディングをサポートしていません。

作業ソリューション:

ここに私が最終的に来たものがあります。

あなたのコンバータクラス:

public class PosterIDConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string userId = (string)value[0];
        IEnumerable users= (IEnumerable)value[1];

        var user = users.FirstOrDefault(u => u.UserID == userId);
        if (user != null)
            return user.ProfilePictureURI;
        return null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

あなたのxamlファイル(単なるサンプル):


    
        
    
    
        
            
                
                    
                        
                        
                    
                    
                        
                        
                            
                                
                                    
                                    
                                
                            
                        
                    
                
            
        
    

In this sample I bound the Text property of a TextBlock to the PosterID and Users property at the same time and used the value converter (IMultiValueConverter) to convert them to image URI.

2
追加された
次にコンバータ(A)を使用して、
追加された 著者 GazTheDestroyer,
あなたはどういう意味ですか?どこに行く? ...そしてあなたが望むものが得られたら、答えを受け入れられたものとしてマークしてください。より多くのヘルプが必要な場合は、問題を説明し、専門家の方々が絶対にお手伝いします。
追加された 著者 Mohammad Dehghan,
現在のオブジェクトを value 入力として取得し、2番目のリストをconverter パラメータとして取得するコンバータ( IValueConverter )を作成します。
追加された 著者 Clemens,
私はすでにビューモデルの設定をしています。各リストはビューモデルのプロパティです。しかし、私は、「B」によって暗示されるように、よりカスタムのDTOを作成したくありません。
追加された 著者 FZdev,
カスタムDTOのList <>をどのように渡すのですか?
追加された 著者 FZdev,
ちょっとMD.Unicorn、心配しないで、私はあなたの助けを忘れていない。それは私がまだこれに固執していることです(私の初めてのWPFデータバインディングと、初めてのWPFのやり方です)。より具体的なデータでOPを更新しました。うまくいけば十分です。
追加された 著者 FZdev,