Silverlight数据绑定组合框不显示初始化值

时间:2010-07-16 11:54:31

标签: silverlight data-binding xaml mvvm combobox

我正在将视图数据绑定到viewmodel,并且无法将组合框初始化为默认值。我在绑定中使用的类的简化是

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>

并且viewmodel包含此代码

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中的所有项目,但选定的值不会显示在组合框中。从下拉列表中选择项目会正确显示它并在viewmodel中设置SelectedLanguage属性。 setter中的断点显示_selectedLanguage仍然包含它被初始化的内容,直到它被值覆盖。

我怀疑有一些小东西我不见了,但在尝试了各种各样的事情和谷歌搜索之后我仍然难倒。我可以通过其他方式获得所需的结果,但真的想要正确使用数据绑定。

2 个答案:

答案 0 :(得分:2)

您需要更改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>

如果您在SeletedLanguage和AvailibleLanguage的'get'上设置断点,您会注意到SelectedLanguage在您的AvailibleLanguage之前被击中。由于这种情况正在发生,因此无法设置SelectedLanguage,因为尚未填充ItemsSource。更改XAML中绑定的顺序将使AvailibleLanguages首先被击中,然后是SelectedLanguage。这应该可以解决你的问题。

答案 1 :(得分:-1)

1)当您分配SelectedLanguage时,使用公共属性SelectedLanguage而不是private _selectedLanguage,以便执行setter,

2)您需要将所选语言的分配移动到加载视图的时刻。您可以通过在View上实现Loaded事件处理程序来实现。如果您想要“mvvm compliance”,那么您应该使用Blend行为将UI加载的事件映射到viewmodel命令实现,您将在其中设置所选语言。