【问题标题】:With linked ComboBoxes, secondary combobox always starts empty使用链接的组合框,辅助组合框始终为空
【发布时间】:2011-06-08 04:29:20
【问题描述】:

我已经尝试了两天来弄清楚这一点,并反复寻找答案。看起来应该就是这么简单。

目标: 我有两个组合框。一个用于对象 Country,另一个用于 CountrySubdivision。 (例如美国有州,加拿大有省等)我想加载表格并同时设置国家和国家细分。

项目有一个 Country 和 CountrySubdivions。 Country 有一个 CountrySubdivision 的 ObservableCollection。所有对象都是 INotifyCollectionChanged。所以这就是令人恼火的地方。绑定“工作”。在那里,如果我更改值并保存,正确的值将被放回数据库中。但是,每次我打开应用程序时,CountrySubdivision 都会开始为空。支持值仍然设置,但组合框未设置。

以下是适用的绑定:

<ComboBox
    x:Name="uiProjectCountrySubdivisions"
    DisplayMemberPath="Name"
    SelectedItem="{Binding Project.ProjectCountrySubdivision}"
    ItemsSource="{Binding Project.ProjectCountry.CountrySubdivisions}"
    FontSize="10.667" />

<ComboBox
    x:Name="uiProjectCountry"
    SelectedItem="{Binding Project.ProjectCountry}"
    ItemsSource="{Binding Countries}"
    DisplayMemberPath="Name"
    FontSize="10.667" />

根据要求,这里是(严重短缺的)课程。

public class Project : BaseNotifyPropertyChanged
{
  private Guid _projectId;
  public virtual Guid ProjectId
  {
    get { return _projectId; }
    set
    {
      if (_projectId != value)
      {
        _projectId = value;
        OnPropertyChanged(() => ProjectId);
      }
    }
  }

  private string _projectName;
  public virtual string ProjectName
  {
    get { return _projectName; }
    set
    {
      if (_projectName != value)
      {
        _projectName = value;
        OnPropertyChanged(() => ProjectName);
      }
    }
  }

  private string _projectNumber;
  public virtual string ProjectNumber
  {
    get { return _projectNumber; }
    set
    {
      if (_projectNumber != value)
      {
        _projectNumber = value;
        OnPropertyChanged(() => ProjectNumber);
      }
    }
  }

  private string _projectAddressLineOne;
  public virtual string ProjectAddressLineOne
  {
    get { return _projectAddressLineOne; }
    set
    {
      if (_projectAddressLineOne != value)
      {
        _projectAddressLineOne = value;
        OnPropertyChanged(() => ProjectAddressLineOne);
      }
    }
  }

  private string _projectAddressLineTwo;
  public virtual string ProjectAddressLineTwo
  {
    get { return _projectAddressLineTwo; }
    set
    {
      if (_projectAddressLineTwo != value)
      {
        _projectAddressLineTwo = value;
        OnPropertyChanged(() => ProjectAddressLineTwo);
      }
    }
  }

  private string _projectCity;
  public virtual string ProjectCity
  {
    get { return _projectCity; }
    set
    {
      if (_projectCity != value)
      {
        _projectCity = value;
        OnPropertyChanged(() => ProjectCity);
      }
    }
  }

  private string _projectZip;
  public virtual string ProjectZip
  {
    get { return _projectZip; }
    set
    {
      if (_projectZip != value)
      {
        _projectZip = value;
        OnPropertyChanged(() => ProjectZip);
      }
    }
  }

  private Country _projectCountry;
  public virtual Country ProjectCountry
  {
    get { return _projectCountry; }
    set
    {
      if (_projectCountry != value)
      {
        _projectCountry = value;
        OnPropertyChanged(() => ProjectCountry);
      }
    }
  } 

  private CountrySubdivision _projectCountrySubdivision;
  public virtual CountrySubdivision ProjectCountrySubdivision
  {
    get { return _projectCountrySubdivision; }
    set
    {
      if (_projectCountrySubdivision != value)
      {
        _projectCountrySubdivision = value;
        OnPropertyChanged(() => ProjectCountrySubdivision);
      }
    }
  }
}  

public class Country : BaseNotifyPropertyChanged
{
  private int _id;
  public virtual int CountryId
  {
    get { return _id; }
    set
    {
      if (_id != value)
      {
        _id = value;
        OnPropertyChanged(() => CountryId);
      }
    }
  }

  private string _name;
  public virtual string Name
  {
    get
    {
      return _name;
    }
    set
    {
      if (_name != value)
      {
        _name = value;
        OnPropertyChanged(() => Name);
      }
    }
  }

  private string _code;
  public virtual string Code
  {
    get
    {
      return _code;
    }
    set
    {
      if (_code != value)
      {
        _code = value;
        OnPropertyChanged(() => Code);
      }
    }
  }

  private ObservableCollection<CountrySubdivision> _countrySubdivisions = new ObservableCollection<CountrySubdivision>();
  public virtual ObservableCollection<CountrySubdivision> CountrySubdivisions
  {
    get
    {
      return _countrySubdivisions;
    }
    set
    {
      if (_countrySubdivisions != value)
      {
        _countrySubdivisions = value;
        OnPropertyChanged(() => CountrySubdivisions);
      }
    }
  }

  private string _subdivisionTypeShortDescription;
  public virtual string SubdivisionTypeShortDescription
  {
    get
    {
      return _subdivisionTypeShortDescription;
    }
    set
    {
      if (_subdivisionTypeShortDescription != value)
      {
        _subdivisionTypeShortDescription = value;
       OnPropertyChanged(() => SubdivisionTypeShortDescription);
      }
    }
  }

  private string _subdivisionTypeLongDescription;
  public virtual string SubdivisionTypeLongDescription
  {
    get
    {
      return _subdivisionTypeLongDescription;
    }
    set
    {
      if (_subdivisionTypeLongDescription != value)
      {
        _subdivisionTypeLongDescription = value;
        OnPropertyChanged(() => SubdivisionTypeLongDescription);
      }
    }
  }
}

public class CountrySubdivision : BaseNotifyPropertyChanged
{
  private int _id;
  public virtual int CountrySubdivisionId
  {
    get { return _id; }
    set
    {
      if (_id != value)
      {
        _id = value;
        OnPropertyChanged(() => CountrySubdivisionId);
      }
    }
  }

  private string _name;
  public virtual string Name
  {
    get { return _name; }
    set
    {
      if (_name != value)
      {
        _name = value;
        OnPropertyChanged(() => Name);
      }
    }
  }

  private Country _country;
  public virtual Country Country
  {
    get { return _country; }
    set
    {
      if (_country != value)
      {
        _country = value;
        OnPropertyChanged(() => Country);
      }
    }
  }
}

public abstract class BaseNotifyPropertyChanged : INotifyPropertyChanged
{
  public virtual event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged(Expression<Func<object>> propertySelector)
  {
    //Stuff that turns () => Property into a fired Property Changed event.
  }
}

请帮忙!!

【问题讨论】:

  • 你能展示一下Project类的实现吗?

标签: c# wpf binding combobox linked-list


【解决方案1】:

ComboBox 上的 SelectedItem 是一个对象吗?如果是这样,它与“Countries”集合中存在的实例完全相同吗?请记住,要让 WPF 考虑“选定”内容,它必须能够在“国家/地区”集合中找到“选定项”。如果这些类型不同或实例不同,则不起作用。

我更喜欢按如下方式绑定我的 ComboBox:

IDictionary<int, string> Countries
int? CountryId

<ComboBox
  ItemsSource="{Binding Countries}"
  SelectedValue="{Binding CountryId}"
  SelectedValuePath="Key"
  DisplayMemberPath="Value"/>

不过,正如 Alex 所要求的,请也列出相关的类定义和相关属性。

【讨论】:

  • 我已将它们添加到原始问题中。国家是一个对象。这些都来自 NHibernate。我尝试按照您上面的说明绑定它,但是由于该项目是需要绑定的值,因此它不起作用。当然我可能做错了。
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多