Поле со списком данных Siliverlight не отображает начальное значение - PullRequest
1 голос
/ 16 июля 2010

Я привязываю данные к модели представления, и у меня возникают проблемы при инициализации комбинированного списка значением по умолчанию.Упрощение класса, который я использую в привязке, это

public class LanguageDetails
{
  public string Code { get; set; }
  public string Name { get; set; }
  public string EnglishName { get; set; }

  public string DisplayName
  {
    get
    {
      if (this.Name == this.EnglishName)
      {
        return this.Name;
      }
      return String.Format("{0} ({1})", this.Name, this.EnglishName);
    }
  }
}

. Комбо-бокс объявляется в XAML представления как

<ComboBox x:Name="LanguageSelector" Grid.Row="0" Grid.Column="1" 
          SelectedItem="{Binding SelectedLanguage,Mode=TwoWay}" 
          ItemsSource="{Binding AvailableLanguages}">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding DisplayName}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

, и модель представления содержит этот код

private List<LanguageDetails> _availableLanguages;
private LanguageDetails _selectedLanguage;

public LoginViewModel()
{
  _availableLanguages = LanguageManager.GetLanguageDetailsForSet(BaseApp.AppLanguageSetID);
  _selectedLanguage = _availableLanguages.SingleOrDefault(l => l.Code == "en");
}

public LanguageDetails SelectedLanguage
{
  get { return _selectedLanguage; }
  set
  {
    _selectedLanguage = value;
    OnPropertyChanged("SelectedLanguage");
  }
}

public List<LanguageDetails> AvailableLanguages
{
  get { return _availableLanguages; }
  set
  {
    _availableLanguages = value;
    OnPropertyChanged("AvailableLanguages");
  }
}

В конце конструктора переменные _availableLanguages ​​и _selectedLanguage устанавливаются, как и ожидалось, раскрывающийся список комбинированного списка содержит все элементы в _availableLanguages, но выбранное значение не отображается в комбинированном списке.Выбор элемента в раскрывающемся меню правильно отображает его и устанавливает свойство SelectedLanguage в модели представления.Точка останова в установщике показывает, что _selectedLanguage по-прежнему содержит то, к чему оно было инициализировано, до тех пор, пока оно не будет перезаписано значением.

Я подозреваю, что есть какая-то небольшая вещь, которую я пропускаю, но после попытки различных вещей и большого количества поиска в Google, яЯ все еще в тупике.Я мог бы достичь желаемого результата другими способами, но действительно хотел бы получить представление о правильном использовании привязки данных.

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

Вам нужно изменить порядок своих привязок в XAML, чтобы ваш ItemsSource связывался до SelectedItem.

<ComboBox x:Name="LanguageSelector" Width="100"  
        ItemsSource="{Binding AvailableLanguages}"
        SelectedItem="{Binding SelectedLanguage,Mode=TwoWay}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding DisplayName}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

Если вы установите точку останова на 'get' как SeletedLanguage, так и AvailableibleLanguage, вызаметит, что SelectedLanguage получает удар перед вашим доступным языком.Поскольку это происходит, невозможно установить SelectedLanguage, потому что ItemsSource еще не заполнен.Изменение порядка привязок в вашем XAML приведет к тому, что сначала удастся получить доступ к доступным языкам, а затем к выбранному языку.Это должно решить вашу проблему.

0 голосов
/ 16 июля 2010

1) Когда вы назначаете SelectedLanguage, используйте открытое свойство SelectedLanguage вместо частного _selectedLanguage, чтобы установщик выполнялся,

2) Вам нужно переместить назначение выбранного языка на тот момент, когда представление было загружено. Вы можете сделать это, внедрив обработчик события Loaded в View. Если вы хотите быть «совместимым с mvvm», вам следует использовать поведение Blend, которое отобразит загруженное в UI событие в реализацию команды viewmodel, в которой вы установите выбранный язык.

...