使用MVVM在组合框中设置默认值

时间:2017-10-08 18:04:38

标签: c# wpf mvvm combobox

我尝试在应用程序首次使用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;值进入组合框?

3 个答案:

答案 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"; } SelectedItemSelectedIndex。你只需要一个。

答案 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");
    }
}