silverlight - Siliverlight 数据绑定(bind)组合框不显示初始化值

标签 silverlight data-binding xaml mvvm combobox

我正在将 View 数据绑定(bind)到 View 模型,并且无法将组合框初始化为默认值。我在绑定(bind)中使用的类的简化是

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);
    }
  }
}

组合框在 View 的 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>

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

我怀疑我遗漏了一些小东西,但是在尝试了各种方法和大量谷歌搜索之后,我仍然感到困惑。我可以通过其他方式达到预期的结果,但我真的想掌握正确使用数据绑定(bind)的方法。

最佳答案

您需要更改 XAML 中的绑定(bind)顺序,以便您的 ItemsSource 在 SelectedItem 之前绑定(bind)。

<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>

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

关于silverlight - Siliverlight 数据绑定(bind)组合框不显示初始化值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3264545/

相关文章:

c# - 如何在Silverlight应用程序中向SQL表中插入数据?

silverlight - 如何在大型项目中重用图标(xaml 路径)?

silverlight - 您使用什么来测试 Silverlight 应用程序?

c# - 全景页面布局更改? window 电话 7

android - 如何使用 android 数据绑定(bind)设置 SwipeRefreshLayout 刷新属性?

javascript - Knockout - 单击绑定(bind)行为

WPF ComboBox 绑定(bind)未按预期工作

c# - 用按钮扩展组合框

xaml - 如何使用 Xamarin.Forms xaml 编辑器预览 ListView

c# - 自定义 MarkupExtension 仅在设计时导致 TypeInitializationException