2014-02-27 48 views
0

我有必然的tbPublications一个ObservableCollection其中填充,因为它应该具有ComboBox。然后,我从另一个触发创建我插入新记录到tbPublications形式,都好一个DataGrid选择一行。组合框的SelectedIndex MVVM WPF

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

我的问题是,在返回我的组合框的形式,新的出版物中没有被设置为在组合框显示所选项目,用户必须点击,然后下拉框中选择项目。

在我看来,我不能使用SelectedIndex = "0" XAML,因为我想在页面加载时在我的ComboBox中显示整个ObservableCollection

有没有办法使用的视图模型的方法也许要解决这个问题,事情也许如..

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

回答

7

您是否考虑过使用ComboBox的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"); 
     } 
    } 
} 

如果你想设置从视图模型选择的项目,您可以设置SelectedPublication财产原样

SelectedPublication = Publications[0]; 

或者您可以在出版物中查找所需物品并将其分配给SelectedPublication物业。

+2

+1。这几乎总是去,除了在案件的方式在概念上的“选择价值”是*的项目在'ComboBox'一个*性质(而不是项目本身),在这种情况下,人们可以使用'SelectedValue'和“SelectedValuePath”。在跟随MVVM时几乎没有理由使用'SelectedIndex'。 –

+0

是的,我的ViewModel中有一个SelectedPublication属性。我的XAML设置为'SelectedItem =“{Binding SelectedPublication,Mode = TwoWay}”',但ComboBox不显示ObservableCollection中的第1行,我仍然需要点击下拉列表并选择它... – Hardgraf

+0

编辑,可能不是最干净的MVVM解决方案... – Hardgraf

2

添加UpdateSourceTrigger =的PropertyChanged到你绑定。

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