2

これがその方法です。Web クライアントを呼び出して、監視可能なコレクションに項目を設定するビューモデルがあります。2 つの異なるページに 2 つの異なるリストボックスが必要ですが、ビューモデルから同じ ItemsSource が必要です。2 つのリストボックスの一方にあるアイテムの数を、他方に影響を与えずに制限するにはどうすればよいですか? アイテムが作成されているビューモデルに .Take(limit) を使用しようとしましたが、それは両方のリストボックスに影響します。

アップデート

ビューモデル

public class MainViewModel : INotifyPropertyChanged
{
    public MainViewModel()
    {
        this.Items = new ObservableCollection<ItemViewModel>();
        this.Mainlist = new CollectionViewSource();

    }

    public ObservableCollection<ItemViewModel> Items { get; private set; }
    public CollectionViewSource Mainlist { get; set; }

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        try
        {
           ...............
            //Ignore the dummy data in foreach loop. Just for showcase.

            foreach (var item in Items)
            {
                //Items creation

                this.Items.Add(new ItemViewModel()
                { LineOne = item });
            }

            this.Mainlist.Source = App.ViewModel.Items;
            this.Mainlist.Filter += (s, a) => 
                a.Accepted = App.ViewModel.Items.IndexOf((ItemViewModel)a.Item) < 10;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    } 

    .....................
}

ビュー側

    public MainPage()
    {
        InitializeComponent();
        DataContext = App.ViewModel;
        list.ItemsSource = App.ViewModel.Mainlist.View;
    }

更新 2

私が見つけた別のオプション(を使用せずにCollectionViewSource)は、新しいものを作成してpublic ObservableCollection<ItemViewModel> Mainlist { get; private set; }もう1つ使用することです

            foreach (var item in Items.Take(limit))
            {
                //Items creation

                this.Mainlist.Add(new ItemViewModel()
                { LineOne = item });
            }

ObservableCollection にデータを入力し、リストボックスを Mainlist にバインドするため。それは機能していますが、そのようにしてデータを複製しているため、それは悪い習慣だと思います。それに関するアイデアはありますか?

4

2 に答える 2

2

CollectionViewSourceを使用し、フィルタリング ロジックを追加して、表示されるアイテムの数を制限できます。たとえば、100 個のアイテムのみを表示する場合:

var cvs = new CollectionViewSource();
cvs.Source = myList;  //the raw list from the viewmodel
cvs.Filter += (s, a) => a.Accepted = myList.IndexOf(a.Item) < 100;
listBox2.ItemsSource = cvs.View;

編集:投稿されたコードに基づく

を設定するMainlist.Sourceと、 も変化Mainlist.Viewします。したがってlist.ItemsSourceMainPageコンストラクターで を設定しても意味がありません (さらに、プロパティはその時点でView最も可能性が高いです)。null問題を解決するには、次の行をMainViewModelコンストラクターに移動する必要があります。

this.Mainlist.Source = App.ViewModel.Items;
this.Mainlist.Filter += (s, a) => 
            a.Accepted = App.ViewModel.Items.IndexOf((ItemViewModel)a.Item) < 10;

Sourceそうすれば、 を1 回設定するだけで、Viewは変更されません。

于 2012-07-07T14:18:39.457 に答える
0

私はおそらくそれを単純に保ち、次のようなことをして、元のアプローチの方向に向かいます。

public MainViewModel()
{
    _items = new ObservableCollection<ItemViewModel>();
}

public ObservableCollection<ItemViewModel> Items { 
    get {return _items;} 
    private set {_items = value;} 
}
private ObservableCollection<ItemViewModel> _items;

private int _items_to_show_on_second_list = 10;

public ObservableCollection<ItemViewModel> ItemsLimit { 
    get {return _items.Take(_items_to_show_on_second_list);} 
    private set {_items = value;} 
}

2 番目の監視可能なコレクションには何も設定したくない場合があることに注意してください。

利点は、ロジックを変更していないことです。コードは引き続き読み取り可能です (Take()と意味のある変数名を使用して、magic number最終的に悪用されることを回避します。

于 2014-08-25T03:23:49.873 に答える