【问题标题】:How to notify an item has selected from data grid in wpf and using mvvm?如何通知项目已从 wpf 中的数据网格中选择并使用 mvvm?
【发布时间】:2013-04-25 14:38:56
【问题描述】:

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

如果我删除触发器部分,则 datagrid 会填充所需的数据。如果包含触发代码,那么我会收到以下错误消息:

在使用 ItemsSource 之前,Items 集合必须为空。

我想知道是否有其他方法可以解决此类问题。我正在使用 MVVM Light 工具包。

【问题讨论】:

    标签: wpf mvvm mvvm-light


    【解决方案1】:

    那个事件触发器应该在别处。应该放在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;}
    

    【讨论】:

    • 谢谢,它解决了一个问题。现在数据网格正在填充数据。但是当我在数据网格中选择项目时,触发器不起作用。你能帮我看看我的触发机制出了什么问题吗?
    • 我很高兴它有所帮助。我不知道你的新问题,因为我对 MVVM-Light 不够熟悉,但是当我在不发送参数的情况下尝试这个时它可以工作,但我认为你应该使用 PassEventArgsToCommand=true 而不是 CommandParameter=.. 然后修改你的命令相应地在 VM 中。
    • 再次感谢,我尝试了但收到此错误消息“无法将 'System.Windows.Controls.SelectionChangedEventArgs' 类型的对象转换为类型 'XMLParsingExample.Model.Student”
    • @User1551892 你在开玩笑吧? :D SelectionChangedEventArgs 这是作为参数传递给您的命令的内容。你可能期待学生。您在 args.AddedItems 属性 Geeeez 中有您选择的学生:D
    • 谢谢,我之前犯了一些错误。
    猜你喜欢
    • 2017-03-29
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多