ComboBox SelectedIndex MVVM WPF

时间:2014-02-27 13:30:25

标签: c# wpf xaml mvvm combobox

我有一个ComboBox绑定到一个tbPublications的ObservableCollection,它应该填充它。然后,我从DataGrid中选择一行,该行触发另一个Create表单,在该表单中我将新记录插入tbPublications,这一切都很好。

当我关闭所述创建表单并返回到我的ComboBox表单时,我正在清除并重新读取我的ObservableCollection中的一个新项目,将用户返回到他们刚刚创建的项目。然后ComboBox显示我新填充的集合中的一个项目,一切都很好。

我的问题是,在返回我的ComboBox表单时,新的出版物未设置为ComboBox显示中的选定项目,用户必须单击ComboBox然后选择该项目。

我无法在我的视图XAML中使用SelectedIndex = "0",因为我想在页面加载时在我的ComboBox中显示整个ObservableCollection

有没有办法在ViewModel中使用一个方法来解决这个问题,有些可能就像..

      private void SetSelectedIndex()
      {
        if (MyObservableCollection.Count == 1)
        {
            //Set selected indexer to "0";
        }
      }

找到了解决方案,不确定它是否是最干净的“MVVM”解决方案......

在我的ObservableCollection中读取后,我调用了这个方法:

 if (_ModelPublicationsObservableList.Count == 1)
                {
                    SelectedPublication = _ModelPublication;
                    SetSelectedIndex();
                }

这是获取当前主窗口并设置SelectedIndex:

的方法
 private void SetSelectedIndex()
    {
        ArticlesDataGridWindow singleOrDefault = (ComboBoxWindow)Application.Current.Windows.OfType<ComboBoxWindow>().SingleOrDefault(x => x.IsLoaded);
        singleOrDefault.comboBox1.SelectedIndex = 0;        
    }

2 个答案:

答案 0 :(得分:8)

您是否考虑使用组合框的SelectedItem属性?您可以绑定组合框的选定项属性以获取或设置所选项目。

<强> XAML

<ComboBox ItemsSource="{Binding Path=Publications}" SelectedItem="{Binding Path=SelectedPublication, Mode=TwoWay}" />

<强>视图模型

public class ItemListViewModel
{
    public ObservableCollection<Publication> Publications {get; set;}

    private Publication _selectedPublication;
    public Publication SelectedPublication 
    {
        get { return _selectedPublication; }
        set
        {
            if (_selectedPublication== value) return;
            _selectedPublication= value;
            RaisePropertyChanged("SelectedPublication");
        }
    }
}

如果要从View模型中设置所选项目,可以将 SelectedPublication 属性设置为 -

SelectedPublication = Publications[0];

或者,您可以在出版物集合中找到所需的项目,并将其分配给 SelectedPublication 属性。

答案 1 :(得分:2)

UpdateSourceTrigger = PropertyChanged 添加到绑定中。

SelectedItem={Binding Path=SelectedPublication, Mode=TwoWay}, UpdateSourceTrigger=PropertyChanged}