我试图通知从数据网格中选择了一个项目,因为我在从数据网格中选择一个项目时打开了一个模式窗口。我正在模式窗口中编辑选定项目,因此我不想为选定项目启用 RaisedPropertychanged 机制,因为当我尝试修改选定项目时,它会打开另一个模式窗口。我现在正在尝试使用事件触发器来解决此问题,但出现错误。下面是相关代码:
视图模型:
public ObservableCollection<Student> sItems {
get {
return ssitems;
}
set {
ssitems = value;
RaisePropertyChanged( "sItems" );
}
}
private StudentsInformation studentInformation;
public StudentsInformation studentInformationObject {
get {
return studentInformation;
}
set {
studentInformation = value;
RaisePropertyChanged( "studentInformationObject" );
}
}
public RelayCommand<Student> SelectionChangedCommand {
get;
set;
}
这些代码行在构造函数中:
SelectionChangedCommand = new RelayCommand<Student>(
item => {
if( item != null ) {
MessengerInstance.Send<Student>( item, "SelectedStudent" );
}
} );
这是与 datagarid 绑定的集合。
看法:
<DataGrid x:Name="dataGrid" Grid.Row="1" Margin="5"
IsReadOnly="False" ColumnHeaderHeight="30"
ItemsSource="{Binding Path=sItems}" AutoGenerateColumns="False"
SelectedItem="{Binding Path=SelectedStudentObject, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<!--<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=myselect, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />-->
<DataGridTextColumn Header="Name" Binding="{Binding name}"></DataGridTextColumn>
<DataGridTextColumn Header="Enrollment" Binding="{Binding enrollment}"></DataGridTextColumn>
<DataGridTextColumn Header="Score" Binding="{Binding score}"></DataGridTextColumn>
<DataGridTextColumn Header="Comment" Binding="{Binding comment}"></DataGridTextColumn>
</DataGrid.Columns>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding SelectionChangedCommand}"
CommandParameter="{Binding SelectedItem}" />
</i:EventTrigger>
</DataGrid>
如果我删除触发器部分,则数据网格会填充所需的数据。如果包含触发代码,那么我会收到以下错误消息:
在使用 ItemsSource 之前,项目集合必须为空。
我想知道是否有其他方法可以解决此类问题。我正在使用 MVVM Light 工具包。