WPF - MVVM - ComboBox SelectedItem

前端 未结 4 639
春和景丽
春和景丽 2021-02-07 05:21

I have ViewModel(implemented INotifyPropertyChanged) in the background and class Category which has only one property of type string

4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-07 05:45

    Your XAML needs a couple of modifications but I think the real problem is with the code you have posted which I don't think is telling the full story. For starters, your combobox ItemSource is bound to a property called Categories but you do not show how this property is coded or how your NodeCategory property is initially synced with the item.

    Try using the following code and you will see that the selected item is kept in sync as the user changes the value in the combobox.

    XAML

    
    
        
        
    

    Code-behind

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private ObservableCollection _categories = new ObservableCollection
        {
            new Category { Name = "Squares"},
            new Category { Name = "Triangles"},
            new Category { Name = "Circles"},
        };
    
        public MainWindow()
        {
            InitializeComponent();
            NodeCategory = _categories.First();
            this.DataContext = this;
        }
    
        public IEnumerable Categories
        {
            get { return _categories; }
        }
    
        private Category _NodeCategory;
        public Category NodeCategory
        {
            get
            {
                return _NodeCategory;
            }
            set
            {
                _NodeCategory = value;
                OnPropertyChanged("NodeCategory");
            }
        }
    
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    [Serializable]
    public class Category : INotifyPropertyChanged
    {
        private string _Name;
        [XmlAttribute("Name")]
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
                OnPropertyChanged("Name");
            }
        }
    
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

提交回复
热议问题