您似乎不必要地设置了您的属性ComboBox
。您可以删除DisplayMemberPath
and SelectedValuePath
具有不同用途的属性。您可以看看SelectedItem、SelectedValue 和 SelectedValuePath 之间的区别 https://stackoverflow.com/questions/4902039/difference-between-selecteditem-selectedvalue-and-selectedvaluepath在此发布以获取这些属性的解释。尝试这个:
<ComboBox Name="cbxSalesPeriods"
ItemsSource="{Binding SalesPeriods}"
SelectedItem="{Binding SelectedSalesPeriod}"
IsSynchronizedWithCurrentItem="True"/>
此外,使用您的displayPeriod
属性,WPF 框架将其称为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 ObservableCollection<SalesPeriodV> salesPeriods = new ObservableCollection<SalesPeriodV>();
public ObservableCollection<SalesPeriodV> 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"); }
}
然后初始化集合your values:
SalesPeriods.Add(new SalesPeriodV() { Month = 3, Year = 2013 } );
SalesPeriods.Add(new SalesPeriodV() { Month = 4, Year = 2013 } );
然后进行数据绑定only这两个属性为ComboBox
:
<ComboBox ItemsSource="{Binding SalesPeriods}" SelectedItem="{Binding SelectedItem}" />
就是这样......这就是一个完美工作示例所需要的一切。您应该看到项目的显示来自ToString
method without your displayPeriod
财产。希望您能从这个代码示例中找出错误。