Со связанными комбинированными списками вторичный комбинированный список всегда начинается пустым - PullRequest
1 голос
/ 08 июня 2011

Я уже два дня пытаюсь это выяснить и постоянно ищу ответы. Кажется, все должно быть так просто.

Цель: У меня есть два комбобокса. Один для объекта Страна, другой для 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 Ответ

1 голос
/ 08 июня 2011

Является ли SelectedItem на вашем ComboBox объектом?Если да, то точно ли такой же экземпляр существует в коллекции "Страны"?Помните, что для того, чтобы WPF рассматривал что-то «Выбранное», он должен иметь возможность найти «Выбранный элемент» в коллекции «Страны».Если эти типы различаются или экземпляры различаются, это не сработает.

Я предпочитаю привязывать свои комбинированные списки следующим образом:

IDictionary<int, string> Countries
int? CountryId

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

Тем не менее, как просит Алекс, перечислите соответствующие определения классов и соответствующиесвойства тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...