使用MVVM绑定ComboBox SelectedItem

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.您可以删除具有不同用途的属性DisplayMemberPathSelectedValuePath属性.您可以在这里查看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

  • @NikitaBrizhak我接受我的原始答案*不*为用户提供完整的解决方案.然而,在回答了很多这些问题后,我意识到由于一些原因,例如缺乏信息或问题作者的理解,很难立即提供答案.因此,我养成了分阶段回答这些问题的习惯,你刚才看到了第一个问题.现在你可以看到第二阶段了.也许在未来,您可以为知名用户提供疑问,并为新用户保存这些类型的评论? (3认同)
  • 但这并没有回答这个问题.设置这些属性不应导致在给定上下文中描述的行为. (2认同)

小智 5

我有一个类似的问题,即当我在组合框中选择某些内容时SelectedItem绑定没有更新。我的问题是我必须为绑定设置UpdateSourceTrigger=PropertyChanged

<ComboBox ItemsSource="{Binding SalesPeriods}" 
          SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)