WPF DataGrid SelectionChanged并单击按钮

时间:2015-06-04 06:23:24

标签: c# wpf xaml

我有一个datagrid,我绑定了一些items.This网格有一个SelectionChanged事件。我有一个Click事件的按钮。问题是当用户点击按钮datagrid 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>

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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事件对我没有用,但隧道工作完成了这项工作。

答案 2 :(得分:1)

您应该使用“Interactivity”程序集和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的王子。

答案 3 :(得分:0)

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