Listbox First Item Selected in mvvm

2019-03-01 04:03发布

问题:

I am new to mvvm. I have a listbox in my silverlight application which is binded to a observable collection in view model i want to make the listbox with first item selected. I tired this but it doesnt work.

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

then i added this in mainpage load of mainpage viewmodel

CurrentCategory = Categorys[0];

Can any one Help me

回答1:

Do the following steps:

  1. Make sure that the collection Categorys is filled already. You might need to use AsycCTP, Asynchronous Programming with Async and Await or some other mechanism to first wait for the collection to be filled.

    The await operator is applied to a task in an asynchronous method to suspend the execution of the method until the awaited task completes. The task represents ongoing work.

  2. Implement INotifyPropertyChanged in ViewModel exposing the Property, CurrentCategory and raise the event of PropertyChanged from within the Setter of the Property.

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

Now you can use the same piece of code:

CurrentCategory = Categorys[0];


回答2:

Try using ICollectionView and IsSynchronizedWithCurrentItem. The CollectionView has all the functionality you need. For example MoveToFirst().

Xaml:

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

ViewModel:

 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; }
        }


回答3:

You Should Try This Way also.................

List c = new List

CurrentCategory = c.firstOrDefault()