0

我试图通知从数据网格中选择了一个项目,因为我在从数据网格中选择一个项目时打开了一个模式窗口。我正在模式窗口中编辑选定项目,因此我不想为选定项目启用 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 工具包。

4

1 回答 1

3

该事件触发器应该在其他地方。它应该放在Interaction.Triggers

像这样使用它:

<DataGrid...>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding SelectionChangedCommand}"
                               CommandParameter="{Binding SelectedItem}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid> 

更新

你可能还应该使用

<cmd:EventToCommand x:Name="SelectionChanged" 
                        Command="{Binding SelectionChangedCommand}" 
                        PassEventArgsToCommand="True" />

并在 VM 中修改您的命令。

RelayCommand<SelectionChangedEventArgs> SelectionChangedCommand{get; private set;}
于 2013-04-25T14:47:45.223 回答