我尝试在应用程序首次使用MVVM模式加载时将默认值设置为组合框,并且看起来这一直是未设置的,组合框在页面加载时始终为空
这是我的xaml:
<ComboBox Grid.Row="0" Margin="10,0,0,0" Grid.Column="1"
SelectedItem="{Binding Path=JuiceOperations.SelectedItemOption, Mode=TwoWay}"
SelectedIndex="{Binding Path=JuiceOperations.SelectedComboBoxOptionIndex, Mode=TwoWay}"
SelectedValue="{Binding Path=JuiceOperations.SelectedComboBoxOptionIndex, Mode=TwoWay}"
ItemsSource="{Binding Path=JuiceOperations.JuiceOptions}" />
这是视图模型代码,其默认构造函数为:
public JuiceViewModel()
{
juiceOperations.SelectedComboBoxOptionIndex = 0;
juiceOperations.SelectedItemOption = "Cola";
}
我试图设置组合框的默认值。
这就是属性的样子:
private List<string> juiceOptions = new List<string> { "Cola", "Sprite", "Fanta", "Pepsi" };
private string selectedItemOption = string.Empty;
private int selectedComboBoxOptionIndex = 0;
public int SelectedComboBoxOptionIndex
{
get
{
return this.selectedComboBoxOptionIndex;
}
set
{
this.selectedComboBoxOptionIndex = value;
this.OnPropertyChanged("SelectedComboBoxOptionIndex");
}
}
public List<string> JuiceOptions
{
get
{
return this.juiceOptions;
}
set
{
this.juiceOptions = value;
}
}
public string SelectedItemOption
{
get
{
return this.selectedItemOption;
}
set
{
this.selectedItemOption = value;
this.OnPropertyChanged("SelectedItemOption");
}
}
从组合框中选择项目时,选择会更新到模型中,也会更新到视图中,因此它按预期工作,但是当页面首次加载时,即使&#34; SelectedComboBoxOptionIndex&#34;和&#34; SelectedItemOption&#34;正在被调用并更新其值,页面视图未更新,空字符串显示在组合框中,我希望看到&#34; Cola&#34;值,而不是空字符串。
有人可以解释一下我做错了什么,我应该如何设置默认&#34; Cola&#34;值进入组合框?
答案 0 :(得分:3)
仅将SelectedItem
的{{1}}属性绑定到ComboBox
源属性,并将后者设置为字符串&#34; Cola&#34;在视图模型中。这应该有效:
SelectedItemOption
<ComboBox Grid.Row="0" Margin="10,0,0,0" Grid.Column="1"
SelectedItem="{Binding Path=JuiceOperations.SelectedItemOption}"
ItemsSource="{Binding Path=JuiceOperations.JuiceOptions}" />
不要混用public JuiceViewModel()
{
juiceOperations.SelectedItemOption = "Cola";
}
,SelectedItem
和SelectedIndex
。你只需要一个。
答案 1 :(得分:0)
juiceOperations.SelectedItemOption
的值,即"Cola"
,与"Cola"
中存储的ItemsSource
不同。您需要执行juiceOperations.SelectedItemOption = juiceOperations.JuiceOptions.First()
之类的操作。
答案 2 :(得分:0)
mm8以上绝对正确,这应该可以解决您的问题。
在旁注中,您所拥有的内容适用于静态选择列表,但请考虑使用ObservableCollection<string>
而不是List<string>
。前者实现了INotifyCollectionChanged,它允许在集合中发生更改时通知视图。将Observable Collection绑定到视图时,视图会自动订阅CollectionChanged事件。如果您需要在运行时添加或删除选项,则需要此选项。旁注,如果您只修改一个项目,OnCollectionChanged将不会触发,因为您仍然需要在设置器中调用OnPropertyChanged("JuiceOptions")
。
类似的东西(带有适当的私人支持字段):
public ObservableCollection<string> JuiceOptions
{
get
{
return this.juiceOptions;
}
set
{
this.juiceOptions = value;
this.OnPropertyChanged("JuiceOptions");
}
}