使用链接的ComboBox,辅助组合框始终为空

时间:2011-06-08 04:29:20

标签: c# wpf binding combobox linked-list

我已经尝试了两天来解决这个问题,并一再寻找答案。看起来应该这么简单。

目标: 我有两个组合框。一个是对象Country,另一个是CountrySubdivision。 (EG USA有国家,加拿大有省份等)我想加载表格并同时使用Country和CountrySubdivision。

项目有Country和CountrySubdivions。 Country有一个ObservableCollection of CountrySubdivision。所有对象都是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.
  }
}

请帮助!!

1 个答案:

答案 0 :(得分:1)

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

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

IDictionary<int, string> Countries
int? CountryId

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

正如Alex所问,请列出相关的课程定义和相关属性。