1

私はmvvmが初めてです。ビュー モデルで監視可能なコレクションにバインドされている Silverlight アプリケーションにリストボックスがあり、最初の項目が選択されたリストボックスを作成したいと考えています。私はこれに疲れましたが、うまくいきません。

<ListBox Height="431" Canvas.Left="17" Canvas.Top="77" Width="215" FontSize="13" ItemsSource="{Binding Path=Categorys, Mode=TwoWay}" DataContext="{Binding}" SelectedItem="{Binding CurrentCategory, Mode=TwoWay}" ItemTemplate="{StaticResource CategoryDataTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Name="lst_category">

次に、これをメインページビューモデルのメインページロードに追加しました

CurrentCategory = Categorys[0];

誰でも助けてくれますか

4

3 に答える 3

1

ICollectionViewと を使用してみてくださいIsSynchronizedWithCurrentItem。CollectionView には、必要なすべての機能があります。たとえばMoveToFirst()

Xaml:

<ListBox ItemsSource="{Binding Categories}" 
                 DisplayMemberPath="Name" 
                 IsSynchronizedWithCurrentItem="True" />

ビューモデル:

 public class ViewModel :INotifyPropertyChanged
        {
            private ObservableCollection<Category> _categories = new ObservableCollection<Category>();
            private Category _currentCategory;

            public ObservableCollection<Category> Categories
            {
                get { return _categories; }
                set { _categories = value; OnPropertyChanged("Categories");}
            }

            public Category CurrentCategory
            {
                get { return _currentCategory; }
                set { _currentCategory = value; OnPropertyChanged("CurrentCategory");}
            }

            public ICollectionView CategoriesView { get; private set; }

            public ViewModel()
            {
                Categories.Add(new Category{Id = Guid.NewGuid(), Name = "Cat1"});
                Categories.Add(new Category{Id = Guid.NewGuid(), Name = "Cat2"});
                Categories.Add(new Category{Id = Guid.NewGuid(), Name = "Cat3"});

                CategoriesView = CollectionViewSource.GetDefaultView(Categories);
                CategoriesView.CurrentChanged += OnCategoriesChanged;
                CategoriesView.MoveCurrentToFirst();
            }

            private void OnCategoriesChanged(object sender, EventArgs e)
            {
                var selectedCategory = CategoriesView.CurrentItem as Category;
                if (selectedCategory == null) return;

                CurrentCategory = selectedCategory;
            }

            public event PropertyChangedEventHandler PropertyChanged;

            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public class Category
        {
            public Guid Id { get; set; }

            public string Name { get; set; }
        }
于 2012-10-29T12:37:23.393 に答える
1

この方法も試してみてください.................

リスト c = 新しいリスト

CurrentCategory = c.firstOrDefault()
于 2013-02-01T05:26:56.603 に答える
1

次の手順を実行します。

  1. Categorysコレクションがすでに満たされていることを確認してください。コレクションがいっぱいになるのを最初に待つために、 AsycCTP、Async と Await を使用した非同期プログラミング、またはその他のメカニズムを使用する必要がある場合があります。

    await演算子は、非同期メソッドのタスクに適用され、待機中のタスクが完了するまでメソッドの実行を中断します。タスクは進行中の作業を表します。

  2. INotifyPropertyChangedを公​​開する ViewModel に実装し、 の内部から PropertyChanged のイベントを発生さPropertyせ ます。CurrentCategorySetterProperty

    private Category _currentCategory = null;
    
    public Category CurrentCategory 
    {
        get { return _currentCategory; }
        set
        {
            if (_currentCategory != value)
            { 
                _currentCategory = value;
    
                // Update bindings
                RaisePropertyChanged("CurrentCategory");
            }
        }
    }
    

これで、同じコードを使用できます。

CurrentCategory = Categorys[0];
于 2012-10-28T11:44:00.687 に答える