使用MVVM绑定ComboBox的SelectedItem

26 浏览
0 Comments

使用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 属性,则会发生以下情况:

\"输入图像说明\"

admin 更改状态以发布 2023年5月23日
0
0 Comments

我曾经遇到过类似的问题,即当我在下拉列表中选择某些东西时,SelectedItem绑定没有更新。我的问题是我必须为绑定设置UpdateSourceTrigger=PropertyChanged。


0
0 Comments

你似乎在你的 ComboBox 上不必要地设置了一些属性。你可以移除 DisplayMemberPathSelectedValuePath 属性,它们具有不同的用途。你可以看看这里的一个帖子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 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"); }
}

然后用你的值初始化了集合:

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

然后只将这两个属性绑定到一个 ComboBox 中:


就这样...你只需要这些就可以得到一个完美工作的示例。你会发现项目的显示来自 ToString 方法,而不是你的 displayPeriod 属性。希望你能从这个代码示例中找出你的错误。

0