【问题标题】:How do I detect row selection in the Xceed DataGrid for WPF如何检测 Xceed DataGrid for WPF 中的行选择
【发布时间】:2009-10-27 15:20:06
【问题描述】:

我对 WPF 的事情感到很害怕,所以请耐心等待。

我正在为 WPF 使用 Xceed DataGrid,我需要知道何时有人选择了一行,但我不知道该怎么做。我确定我需要添加一些 XAML 来启用它,但我不知道我应该做什么。

【问题讨论】:

    标签: wpf datagrid xceed


    【解决方案1】:

    我使用 MVVM 方法,因此更喜欢数据绑定。我会将 SelectedItem 属性绑定到网格的 ViewModel 对象上的 SelectedItem 属性。

    <xcdg:DataGridControl x:Name="grid" SelectedItem="{Binding SelectedItem}">
    </xcdg:DataGridControl>
    

    然后,您的属性设置器可以在 SelectedItemChanged() 方法发生更改时执行任何必要的操作。

    private IMyItem _selectedItem;
    public IMyItem SelectedItem
    {
       get { return _selectedItem; }
       set { 
              _selectedItem = value;
              OnPropertyChanged("SelectedItem");
              SelectedItemChanged();
           }
    }
    

    【讨论】:

      【解决方案2】:

      我自己实际上也在为同样的事情苦苦挣扎,除了我有一个先决条件,即选择通知是通过 ICommand 完成的;但是,如果您没有此需要,则可以连接 SelectionChanged 事件处理程序。这是非常基本的东西,但我会包含代码以防万一:

      XAML:

       <Grid>
          <DataGrid:DataGridControl x:Name="gridControl" SelectionChanged="gridControl_SelectionChanged">
              <!-- Content -->
          </DataGrid:DataGridControl>
      </Grid>
      

      代码隐藏:

      private void gridControl_SelectionChanged(object sender, Xceed.Wpf.DataGrid.DataGridSelectionChangedEventArgs e)
              {
              var selectedIndex = gridControl.SelectedIndex; // int index
              var selectedItem = gridControl.SelectedItem;   // instance of bound object
              var selectedItems = gridControl.SelectedItems; // IList of bound objects
              }
      

      说了这么多,我很想知道是否有任何优雅的解决方案可以使用 ICommand 从 Xceed DataGrid 中获取选定的行(在我的情况下,我使用的是匿名类型,这会有所作为) ...

      【讨论】:

      • 我的 Xceed 网格没有这个事件,所以它是不可能的。有专业版吗?
      • 啊,是的,我确实...没有意识到他们会限制事件处理程序。我觉得很奇怪。
      【解决方案3】:

      您不必为简单的事情编写复杂的代码......虽然它可能会变得乏味,但这里有一些代码适合您。我希望这会有所帮助:

      <Style TargetType="xcdg:DataRow">
         <EventSetter Handler="dr_PreviewMouseDown" Event="PreviewMouseDown" />
      </Style>
      
      void dr_PreviewMouseDown(object sender, MouseButtonEventArgs e)
      {
         DataRow dr = sender as DataRow;
      
         Debug.WriteLine(sender);
      }
      

      【讨论】:

        【解决方案4】:

        这就是我的想法

            System.ComponentModel.DependencyPropertyDescriptor gridItemsSourceDescriptor = System.ComponentModel.DependencyPropertyDescriptor.FromProperty(DataGridControl.SelectedItemProperty, typeof(DataGridControl));
            gridItemsSourceDescriptor.AddValueChanged(dgBaxRuns, HandleSelectionChanged);
        

        【讨论】:

        【解决方案5】:

        我为我做了一个最简单的方法。

        <xctk:MaterialButton Margin="5,0,5,0" Grid.Column="3" Content="Szűrt sorok kijelölése" Command="{Binding SelectFilteredRowsCommand}" CommandParameter="{Binding ElementName=MyDataGrid}" />
        

        所以,我将带有命令参数的数据网格发送到视图模型。

         public RelayCommand<object> SelectFilteredRowsCommand { get; set; }
        
        SelectFilteredRowsCommand = new RelayCommand<object>((o) =>
                    {
                        var datagrid = o as DataGridControl;
                        if (datagrid != null)
                        {
                            var datagriditems = datagrid.Items.Cast<SelectableProduct>();
                            foreach (SelectableProduct selectableProduct in datagriditems)
                            {
                                selectableProduct.IsSelect = true;
                            }
                        }
                    });
        

        并转换回datagrid itemsoruce类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-16
          • 1970-01-01
          • 2011-08-12
          • 1970-01-01
          • 2011-02-15
          • 2011-02-21
          • 1970-01-01
          • 2012-02-03
          相关资源
          最近更新 更多