C# 在MVVM中设置组合框的SelectedItem
我有一个组合框,selectionchanged事件的组合框附带其各自的命令,在更改所选项目(从下拉列表)时,命令会按预期启动,但在我从代码中设置所选项目时不会启动 这是我尝试过的一些代码C# 在MVVM中设置组合框的SelectedItem,c#,wpf,mvvm,combobox,relaycommand,C#,Wpf,Mvvm,Combobox,Relaycommand,我有一个组合框,selectionchanged事件的组合框附带其各自的命令,在更改所选项目(从下拉列表)时,命令会按预期启动,但在我从代码中设置所选项目时不会启动 这是我尝试过的一些代码 Projects.Add(new Project { ProjectName = "Project 1" }); Projects.Add(new Project { ProjectName = "Project 2" }); Projects.Add(new
Projects.Add(new Project { ProjectName = "Project 1" });
Projects.Add(new Project { ProjectName = "Project 2" });
Projects.Add(new Project { ProjectName = "Project 3" });
Projects.Add(new Project { ProjectName = "Project 4" });
SelectedProject = Projects[0]; // I am expecting selection changed command execution here
ICommand _projectSelectionChangedCommand;
public ICommand ProjectSelectionChangedCommand
{
get
{
return _projectSelectionChangedCommand ?? (_projectSelectionChangedCommand = new RelayCommand(ProjectSelection));
}
}
ObservableCollection<Project> _projects;
public ObservableCollection<Project> Projects
{
get { return _projects; }
set
{
_projects = value;
NotifyPropertyChanged("Projects");
}
}
public Project SelectedProject
{
get { return _selectedProject; }
set
{
_selectedProject = value;
NotifyPropertyChanged("SelectedProject");
}
}
Projects.Add(新项目{ProjectName=“Project 1”});
添加(新项目{ProjectName=“Project 2”});
添加(新项目{ProjectName=“Project 3”});
添加(新项目{ProjectName=“project4”});
SelectedProject=项目[0];//我期待在这里更改命令执行的选择
i命令\u项目选择更改命令;
公共ICommand项目选择更改命令
{
得到
{
返回_projectSelectionChangedCommand??(_projectSelectionChangedCommand=newrelaycommand(ProjectSelection));
}
}
可观测收集项目;
公共收集项目
{
获取{return\u projects;}
设置
{
_项目=价值;
通知财产变更(“项目”);
}
}
公共项目选定项目
{
获取{return\u selectedProject;}
设置
{
_selectedProject=值;
NotifyPropertyChanged(“SelectedProject”);
}
}
我的xaml是这样的
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Projects}" DisplayMemberPath="ProjectName" SelectedItem="{Binding SelectedProject}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ProjectSelectionChangedCommand}"></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
确保在SelectedItem绑定中使用,否则无法保证所选项目会更改
另外,请注意,尝试显式设置ComboBox可用项中不存在的值将导致它设置为null。试图手动设置空值在行为上有额外的异常,这表明基础系统在实际值的集合之间使用空值。确保您的组合框为SelectedItem设置了双向绑定集,以及
IsSynchronizedWithCurrentItem
<ComboBox Grid.Row="1" Grid.Column="1"
ItemsSource="{Binding Projects}"
DisplayMemberPath="ProjectName"
SelectedItem="{Binding SelectedProject, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
IsSynchronizedWithCurrentItem="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ProjectSelectionChangedCommand}"></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
我模糊地记得,在创建绑定之前,SelectedProject必须设置为有效实例,如果为空,则绑定将在从数据上下文到视图的方向上永久中断。SelectedProject属性的外观如何?@d.moncada我已使用SelectedProject属性更新了问题我将其设置为SelectedProject=Project[0]。因此,这无法设置组合框的itemssource中不存在的值。但即使使用Mode=TwoWay.SelectedProject=Projects[0]也无法工作,因此设置的值是正确的。