0

1ObservableCollection<T>つのタイプのオブジェクトを保持する があります。これをいくつかのリスト コントロールのソースにする必要がありますが、データも変換したいと考えています。ObservableCollection<int>簡単にするために、私が を持っていて、文字列を返すを取得したいと想像してくださいICollectionView。おそらく、文字列に変換された整数だけです。

そのようなビューを作成する方法はありますか?

次のような素晴らしいもの:

var view = new MagicalCollectionView(myCollection, x => x.ToString())?
4

3 に答える 3

1

コレクション ビューは、並べ替え、フィルタリング、グループ化に関するものです。それらはデータ変換に関するものではありません。

実際、タスクの解釈では、そのようなコレクションは直接必要ありません。ビューを適切に設定する必要があるだけです。たとえばDataTemplate、ソース コレクション内のアイテムに正しいものを提供します。

public class MyEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MyViewModel
{
    public ObservableCollection<MyEntity> Entities { get; private set; }
    public ICollectionView EntitiesView
    {
        if (view == null)    
        {
            view = new ListCollectionView(Entities);
        }
        return view;
    }
    private ICollectionView view;
}

XAML:

<DataTemplate DataType="{x:Type local:MyEntity}">
    <!-- This "transforms" visual representation of your entity, but the entity itself (and its container) remains unchanged -->
    <TextBlock Text="{Binding Name}"/>
</DataTemplate>

更新します。あなたのコメントによると、私はエンティティをビューモデルにラップします。さらに、これはビューモデルの目的です。

public class MyEntityViewModel
{
    private readonly MyEntity model;

    public MyEntityViewModel(MyEntity model)
    {
        this.model = model;
    }

    public int MyInt
    {
        get { return model. // some logic to retrieve int ... }
    }

    public string MyString
    {
        get { return model. // some logic to retrieve string ... }
    }
}

次に、モデルのコレクションの代わりに、コントロールをビュー モデルのコレクションにバインドします。

public class MyViewModel
{
    public MyViewModel(ICollection<MyEntity> entities)
    {
        this.Entities = new ObservableCollection<MyEntityViewModel>(entities.Select(e => new MyEntityViewModel(e)));

        // this will keep two collections synchronized:
        this.Entities.CollectionChanged += (sender, args) =>
        {
            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    entities.Add((MyEntity)e.NewItems[0]);
                    break;
                case NotifyCollectionChangedAction.Remove:
                    entities.Remove((MyEntity)e.OldItems[0]);
                    break;
                case NotifyCollectionChangedAction.Replace:
                    entities.Remove((MyEntity)e.OldItems[0]);
                    entities.Add((MyEntity)e.NewItems[0]);
                    break;
                case NotifyCollectionChangedAction.Reset:
                    entities.Clear();
                    break;
            }
        }
    }            

    public ObservableCollection<MyEntityViewModel> Entities { get; private set; }
}

これにより、表示のみを目的とした追加のプロパティからデータ クラスを明確に保つことができます。

于 2013-07-09T10:44:21.037 に答える