我有一个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;
}
答案 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}