我有一个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>
答案 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属性。我认为这是你问题的原因。尝试禁用属性或重新编码按钮单击事件处理程序。