WPF数据表格的SelectionChanged和按钮单击事件

3

我有一个数据表格,我将一些项目绑定到它上面。这个表格有一个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>

你解决了这个问题吗? - Noam M
4个回答

3
你可以检查 SelectionChangedEventArgsOriginalSource 属性,这样你就能确定引发事件的控件,如果是由按钮引发的,则忽略。

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的某种方式,我会很想看看并学习一些有用的东西。

对于我来说,按钮的Click事件不起作用,但隧道事件却完成了工作。


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的原则。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接