【问题标题】:WPF DataGrid SelectionChanged and button clickWPF DataGrid SelectionChanged 和按钮单击
【发布时间】:2015-06-04 06:23:24
【问题描述】:

我有一个数据网格,我绑定了一些项目。这个网格有一个 SelectionChanged 事件。我有一个带有 Click 事件的按钮。问题是当用户单击按钮时,数据网格 selectionchanged 事件也被触发了。

private void dgLogins_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
    UserLoginEO objUserLogin = (UserLoginEO)dgLogins.SelectedItem;
        txtCodeKarbar.Text = objUserLogin.CodeKarbar.ToString();
        txtName.Text = objUserLogin.Name;
        txtFamily.Text = objUserLogin.Family;
        txtUserName.Text = objUserLogin.UserName;

    e.Handled = true;   
}

XAML:

<DataGrid Margin="0,228,0,0"  Name="dgLogins" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=ObsUsers,  ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="dgLogins_SelectionChanged" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="UserId">
            <DataGridTextColumn.Binding>
                <Binding  Path="CodeKarbar" Mode="TwoWay">
                </Binding>
            </DataGridTextColumn.Binding>
            </DataGridTextColumn>
        <DataGridTextColumn Header="Name">
            <DataGridTextColumn.Binding>
                <Binding  Path="Name" Mode="TwoWay">
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Familt">
            <DataGridTextColumn.Binding>
                <Binding  Path="Family" Mode="TwoWay">
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
        <DataGridTextColumn Header="UserName">
            <DataGridTextColumn.Binding>
                <Binding  Path="UserName" Mode="TwoWay">
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 问题解决了吗?

标签: c# wpf xaml


【解决方案1】:

您可以检查SelectionChangedEventArgs的OriginalSource属性,这样您就可以检查哪个控件引发的事件,如果它来自按钮而不是忽略。

【讨论】:

    【解决方案2】:

    我有一个丑陋的方法,但对我来说它有效:

    这是我的选择更改事件:

    private void DataGrid_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = sender as DataGrid;
    
        if (btnClicked)
        {
            if (e.RemovedItems.Count == 0)
            {
                dg.SelectionChanged -= new SelectionChangedEventHandler(DataGrid_OnSelectionChanged);
                var op1 = dg.Dispatcher.BeginInvoke(new Action(() => dg.SelectedIndex = -1),
                    System.Windows.Threading.DispatcherPriority.ContextIdle);
                op1.Completed += new EventHandler((s, ea) => dg.SelectionChanged +=
                    new SelectionChangedEventHandler(DataGrid_OnSelectionChanged));
            }
            else
            {
                dg.SelectionChanged -= new SelectionChangedEventHandler(DataGrid_OnSelectionChanged);
                var op2 = dg.Dispatcher.BeginInvoke(new Action(() => dg.SelectedItem = e.RemovedItems[0]),
                    System.Windows.Threading.DispatcherPriority.ContextIdle);
                op2.Completed += new EventHandler((s, ea) => dg.SelectionChanged +=
                    new SelectionChangedEventHandler(DataGrid_OnSelectionChanged));
            }
            btnClicked = false;
            return;
        }
    }
    

    还有我的按钮的预览事件:

    private bool btnClicked = false;
    private void BtnTestSelection_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        btnClicked = true;
    }
    

    因此,基本上,如果之前没有进行任何选择,我们将通过设置 SelectedIndex = -1 来保持这种状态。否则,我们将选择返回到前一个。在这两种情况下,我们都删除了处理程序以避免无限调用,并在 OnCompleted 上再次添加它。

    如果有人有优雅的方式,也许以某种方式重新定义 DataGrid,我会很想看到它并学习一些有用的东西。

    Button 的 Click 事件对我不起作用,但隧道事件完成了。

    【讨论】:

      【解决方案3】:

      您应该使用“交互”程序集和SelectionChanged 事件。

      <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}">
          <DataGrid.Columns>
              <DataGridTextColumn Header="ID" Binding="{Binding ID}" />
              <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
          </DataGrid.Columns>
          <i:Interaction.Triggers>
              <i:EventTrigger EventName="SelectionChanged">
                  <i:InvokeCommandAction Command="{Binding MyCommand}" />
              </i:EventTrigger>
          </i:Interaction.Triggers>
      </DataGrid>
      

      其中“i”是命名空间:

      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
      

      当某些事件触发时,会激活您想要的所有命令,同时仍保留 MVVM 的优势。

      【讨论】:

        【解决方案4】:

        您在 DataGrid 中使用 IsSynchronizedWithCurrentItem 属性。我认为这是您的问题的原因。尝试禁用属性或重新编码按钮单击事件处理程序。

        【讨论】:

          猜你喜欢
          • 2011-08-03
          • 1970-01-01
          • 2015-05-05
          • 2012-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多