使用MVVM绑定ComboBox的SelectedItem
使用MVVM绑定ComboBox的SelectedItem
我在我的 ComboBox 中有一个 SelectedItem 的问题。
如果我打开 ComboBox,我可以看到值。
如果我选择一个项目,则所选项目不会显示。
有人有主意吗?
在我的 ViewModel 中,我有这两个属性:
public ObservableCollection SalesPeriods { get; private set; } private SalesPeriodVM selectedSalesPeriod; public SalesPeriodVM SelectedSalesPeriod { get { return selectedSalesPeriod; } set { if (selectedSalesPeriod != value) { selectedSalesPeriod = value; RaisePropertyChanged("SelectedSalesPeriod"); } } }
这些是类的一些属性:
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); }
编辑:
如果我移除 DisplayMemberPath 属性,则会发生以下情况:
你似乎在你的 ComboBox
上不必要地设置了一些属性。你可以移除 DisplayMemberPath
和 SelectedValuePath
属性,它们具有不同的用途。你可以看看这里的一个帖子Difference between SelectedItem, SelectedValue and SelectedValuePath,了解这些属性的解释。试试这个:
此外,使用你的 displayPeriod
属性是没有意义的,因为 WPF Framework 会自动调用 ToString
方法来显示需要显示的对象,而不需要为它们显式地设置一个 DataTemplate
。
更新 >>>
由于我不能看到你的所有代码,我不能告诉你你做错了什么。相反,我只能为你提供一个完整的可工作的示例,展示如何实现你想要的功能。我从你的类中删除了无意义的 displayPeriod
属性,也删除了你的 SalesPeriodVO
属性,因为我对此一无所知......也许这是你的问题的原因?尝试这个:
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")); } } }
然后我在视图模型中添加了两个属性:
private ObservableCollectionsalesPeriods = 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"); } }
然后用你的值初始化了集合:
SalesPeriods.Add(new SalesPeriodV() { Month = 3, Year = 2013 } ); SalesPeriods.Add(new SalesPeriodV() { Month = 4, Year = 2013 } );
然后只将这两个属性绑定到一个 ComboBox
中:
就这样...你只需要这些就可以得到一个完美工作的示例。你会发现项目的显示来自 ToString
方法,而不是你的 displayPeriod
属性。希望你能从这个代码示例中找出你的错误。