列表框在mvvm中选择的第一个项目

时间:2012-10-28 11:36:58

标签: c# xaml mvvm silverlight-4.0

我是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">

然后我在mainpage viewmodel的主页加载中添加了这个

CurrentCategory = Categorys[0];

任何人都可以帮助我

3 个答案:

答案 0 :(得分:1)

执行以下步骤:

  1. 确保已经填充了集合Categorys。您可能需要使用AsycCTP, Asynchronous Programming with Async and Await或其他一些机制来首先等待收集集合。

      

    await运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。该任务代表了正在进行的工作。

  2. 在ViewModel中实施INotifyPropertyChanged,公开PropertyCurrentCategory并在Setter的{​​{1}}内举起PropertyChanged事件。< / p>

    Property
  3. 现在您可以使用相同的代码:

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

答案 1 :(得分:1)

尝试使用ICollectionViewIsSynchronizedWithCurrentItem。 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; }
        }

答案 2 :(得分:1)

你也应该尝试这种方式.................

列出c =新列表

CurrentCategory = c.firstOrDefault()