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

执行以下步骤:

  1. 确保集合Categorys已填满。您可能需要使用AsycCTP、使用 Async 和 Await 进行异步编程或其他一些机制来首先等待集合被填充。

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

  2. INotifyPropertyChanged在 ViewModel 中实现公开Property, 并从中CurrentCategory引发 PropertyChanged 事件。SetterProperty

    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 回答
1

尝试使用ICollectionViewIsSynchronizedWithCurrentItem。CollectionView 具有您需要的所有功能。例如MoveToFirst().

xml:

<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 回答