Enlace de ComboBox SelectedItem utilizando MVVM

Tengo un problema con SelectedItem en mi ComboBox .

 

Aquí hay algo bien Si abro el ComboBox, veo los valores.

enter image description here Si selecciono un artículo, el artículo seleccionado no se mostrará.

¿Alguien tiene una idea?

En mi ViewModel tengo estas dos propiedades:

 public ObservableCollection SalesPeriods { get; private set; } private SalesPeriodVM selectedSalesPeriod; public SalesPeriodVM SelectedSalesPeriod { get { return selectedSalesPeriod; } set { if (selectedSalesPeriod != value) { selectedSalesPeriod = value; RaisePropertyChanged("SelectedSalesPeriod"); } } } 

Estas son algunas propiedades de la clase:

 public SalesPeriodVO Vo { get { return period; } } public int Year { get { return period.Year; } set { if (period.Year != value) { period.Year = value; RaisePropertyChanged("Year"); } } } public int Month { get { return period.Month; } set { if (period.Month != value) { period.Month = value; RaisePropertyChanged("Month"); } } } public string displayPeriod { get { return this.ToString(); } } public override string ToString() { return String.Format("{0:D2}.{1}", Month, Year); } 

EDITAR : sucede lo siguiente si elimino la propiedad DisplayMemberPath: enter image description here

Parece que configura innecesariamente propiedades en su ComboBox . Puede eliminar las propiedades DisplayMemberPath y SelectedValuePath que tienen diferentes usos. Puede ser una buena idea que eche un vistazo a la diferencia entre SelectedItem, SelectedValue y SelectedValuePath para obtener una explicación de estas propiedades. Prueba esto:

  

Además, no tiene sentido utilizar su propiedad displayPeriod , ya que el Framework WPF llamaría automáticamente al método ToString para los objetos que necesita mostrar y que no tienen configurado DataTemplate explícitamente.


ACTUALIZACIÓN >>>

Como no puedo ver todo tu código, no puedo decirte lo que estás haciendo mal. En cambio, todo lo que puedo hacer es brindarle un ejemplo completo de cómo lograr lo que desea. He eliminado la propiedad displayPeriod inútil y también su propiedad SalesPeriodVO de su clase, ya que no sé nada al respecto … ¿tal vez esa es la causa de su problema? Prueba esto:

 public class SalesPeriodV { private int month, year; public int Year { get { return year; } set { if (year != value) { year = value; NotifyPropertyChanged("Year"); } } } public int Month { get { return month; } set { if (month != value) { month = value; NotifyPropertyChanged("Month"); } } } public override string ToString() { return String.Format("{0:D2}.{1}", Month, Year); } public virtual event PropertyChangedEventHandler PropertyChanged; protected virtual void NotifyPropertyChanged(params string[] propertyNames) { if (PropertyChanged != null) { foreach (string propertyName in propertyNames) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged(this, new PropertyChangedEventArgs("HasError")); } } } 

Luego agregué dos propiedades en el modelo de vista:

 private ObservableCollection salesPeriods = new ObservableCollection(); public ObservableCollection SalesPeriods { get { return salesPeriods; } set { salesPeriods = value; NotifyPropertyChanged("SalesPeriods"); } } private SalesPeriodV selectedItem = new SalesPeriodV(); public SalesPeriodV SelectedItem { get { return selectedItem; } set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); } } 

Luego inicializó la colección con sus valores:

 SalesPeriods.Add(new SalesPeriodV() { Month = 3, Year = 2013 } ); SalesPeriods.Add(new SalesPeriodV() { Month = 4, Year = 2013 } ); 

Y luego, los datos vinculan solo estas dos propiedades a un ComboBox :

  

Eso es todo … eso es todo lo que necesitas para un ejemplo que funcione perfectamente. Debería ver que la visualización de los elementos proviene del método ToString sin su propiedad displayPeriod . Con suerte, puede resolver sus errores a partir de este ejemplo de código.

      //student Class public class Student { public int Id { set; get; } public string name { set; get; } } //set 2 properties in MainWindow.xaml.cs Class public ObservableCollection studentInfo { set; get; } public Student SelectedstudentInfo { set; get; } //MainWindow.xaml.cs Constructor public MainWindow() { InitializeComponent(); bindCombo(); this.DataContext = this; cmbData.ItemsSource = studentInfo; } //method to bind cobobox or you can fetch data from database in MainWindow.xaml.cs public void bindCombo() { ObservableCollection studentList = new ObservableCollection(); studentList.Add(new Student { Id=0 ,name="==Select=="}); studentList.Add(new Student { Id = 1, name = "zoyeb" }); studentList.Add(new Student { Id = 2, name = "siddiq" }); studentList.Add(new Student { Id = 3, name = "James" }); studentInfo=studentList; } //button click to get selected student MainWindow.xaml.cs private void Button_Click(object sender, RoutedEventArgs e) { Student student = SelectedstudentInfo; if(student.Id ==0) { MessageBox.Show("select name from dropdown"); } else { MessageBox.Show("Name :"+student.name + "Id :"+student.Id); } }