Ren*_*ter 29 c# data-binding wpf binding mvvm
我的ComboBox中的SelectedItem有问题.
<ComboBox Name="cbxSalesPeriods"
ItemsSource="{Binding SalesPeriods}"
DisplayMemberPath="displayPeriod"
SelectedItem="{Binding SelectedSalesPeriod}"
SelectedValuePath="displayPeriod"
IsSynchronizedWithCurrentItem="True"/>
Run Code Online (Sandbox Code Playgroud)
如果我打开ComboBox,我会看到值.
如果我选择一个项目,则不会显示所选项目.
有人有想法吗?
在我的ViewModel中,我有以下两个属性:
public ObservableCollection<SalesPeriodVM> SalesPeriods { get; private set; }
private SalesPeriodVM selectedSalesPeriod;
public SalesPeriodVM SelectedSalesPeriod
{
get { return selectedSalesPeriod; }
set
{
if (selectedSalesPeriod != value)
{
selectedSalesPeriod = value;
RaisePropertyChanged("SelectedSalesPeriod");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些是该类的一些属性:
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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:以下发生如果我删除属性DisplayMemberPath:

She*_*dan 44
您似乎在不必要地设置属性ComboBox.您可以删除具有不同用途的属性DisplayMemberPath和SelectedValuePath属性.您可以在这里查看SelectedItem,SelectedValue和SelectedValuePath之间的差异,以获取对这些属性的解释.试试这个:
<ComboBox Name="cbxSalesPeriods"
ItemsSource="{Binding SalesPeriods}"
SelectedItem="{Binding SelectedSalesPeriod}"
IsSynchronizedWithCurrentItem="True"/>
Run Code Online (Sandbox Code Playgroud)
此外,使用您的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"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在视图模型中添加了两个属性:
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"); }
}
Run Code Online (Sandbox Code Playgroud)
然后使用您的值初始化集合:
SalesPeriods.Add(new SalesPeriodV() { Month = 3, Year = 2013 } );
SalesPeriods.Add(new SalesPeriodV() { Month = 4, Year = 2013 } );
Run Code Online (Sandbox Code Playgroud)
然后数据只将这两个属性绑定到ComboBox:
<ComboBox ItemsSource="{Binding SalesPeriods}" SelectedItem="{Binding SelectedItem}" />
Run Code Online (Sandbox Code Playgroud)
就是这样......这就是一个完美工作的例子.您应该看到项目的显示来自没有您的属性的ToString方法.希望您可以通过此代码示例解决您的错误.displayPeriod
小智 5
我有一个类似的问题,即当我在组合框中选择某些内容时SelectedItem绑定没有更新。我的问题是我必须为绑定设置UpdateSourceTrigger=PropertyChanged。
<ComboBox ItemsSource="{Binding SalesPeriods}"
SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
125727 次 |
| 最近记录: |