Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVVM中设置组合框的SelectedItem_C#_Wpf_Mvvm_Combobox_Relaycommand - Fatal编程技术网

C# 在MVVM中设置组合框的SelectedItem

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

我有一个组合框,selectionchanged事件的组合框附带其各自的命令,在更改所选项目(从下拉列表)时,命令会按预期启动,但在我从代码中设置所选项目时不会启动

这是我尝试过的一些代码

        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]也无法工作,因此设置的值是正确的。