我正在将视图数据绑定到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仍然包含它被初始化的内容,直到它被值覆盖。
我怀疑有一些小东西我不见了,但在尝试了各种各样的事情和谷歌搜索之后我仍然难倒。我可以通过其他方式获得所需的结果,但真的想要正确使用数据绑定。
答案 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命令实现,您将在其中设置所选语言。