列表框第一项选择MVVM(Listbox First Item Selected in mvvm)

2019-08-02 01:16发布

我是新来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];

谁能帮我

Answer 1:

请执行下列操作步骤:

  1. 确保收集Categorys已经填满。 您可能需要使用AsycCTP,异步编程与异步和等待或一些其他机制来首先等待要填充的集合。

    在AWAIT操作者施加到任务中的异步方法,直到等待任务完成暂停方法的执行。 该任务表示正在进行的工作。

  2. 实施INotifyPropertyChanged在视图模型暴露的PropertyCurrentCategory从内部提升的PropertyChanged的事件Setter的的Property

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

现在你可以使用相同的代码:

CurrentCategory = Categorys[0];


Answer 2:

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


Answer 3:

你应该试试这个方式也.................

名单C =新名单

CurrentCategory = c.firstOrDefault()


文章来源: Listbox First Item Selected in mvvm