WPF C#导入时如何避免事件触发
本文关键字:事件 何避免 导入 WPF | 更新日期: 2023-09-27 18:29:41
我有一个带窗口的WPF应用程序,其中逐个显示了不同的UserControls,无需单击按钮。
我从一个文件中导入数据,所有数据都存储在一个公共对象"ImportExportData"中。所有UserControls都绑定到ImportExportData类的相应属性(作为自定义对象,如Data1、Data2…)。
在我的USerControl中,我有NumberZones项目的组合框,这些SelectionChanged事件分别处理。在此组合框的SelectionChanged事件中,根据所选的数量,将许多行添加到数据2的ObservableCollection属性中。
在导入数据并将导入的对象(Data2)设置为USerControl2的DataContext时,它会将NumberZones属性值设置为相应的组合框,并且SelectionChanged事件会按原样触发。此时,对象已经在ObservableCollection中包含reqd行,此事件不应添加它
PArent窗口有一个标志"importedData",它告诉我对象已导入。但一旦加载了UserContrl2,我就不能把它设为false,因为它们是UC2之后的UC。在UC2中,我可以创建另一个标志"importing",并在加载所有UI后将其设为false。通过哪个UC事件,我可以知道UI已加载,从而使"导入"为false??
我想知道当导入的对象填充UI组件时,如何避免触发SelectionChanged事件。在这种情况下,UserControl的哪个事件将帮助我在USerControl2中保留一个标志。
有什么想法、建议吗。
很难理解你的所有问题,所以请耐心等待……我会解决我理解的每一点。
通过哪个UC事件,我可以知道UI已加载,从而使"导入"为false??
请查看MSDN上的FrameworkElement.Loaded事件页面。
我想知道当导入的对象填充UI组件时,如何避免触发SelectionChanged事件。
实现这一目标有两种方法。。。第一种方法不是停止触发事件,而是在导入数据时忽略。基本上包括暂时取消订阅SelectionChanged
事件,然后重新订阅它。如果我理解正确,您的父级Window
中有一个bool
属性,UserControl
s中有SelectionChanged
处理程序…首先,您可以在每个UserControl
s中添加bool
属性:
public bool CanChangeSelection { get; set; }
现在,在您的父Window
中(假设您有对控件的引用),您可以更新您的属性:
private bool isImporting = false;
public bool IsImporting
{
get { return isImporting; }
set
{
isImporting = value;
UserControl1.CanChangeSelection = isImporting;
UserControl2.CanChangeSelection = isImporting;
...
UserControlN.CanChangeSelection = isImporting;
}
}
最后,在您的控制下SelectionChanged
处理程序:
private void SelectionChangedHandler(object sender, RoutedEventArgs e)
{
if (CanChangeSelection)
{
// do your stuff in here
}
}
第二种方法基本上包括暂时取消订阅SelectionChanged
事件,然后重新订阅。对于此选项,我们需要在您的每个UserControl
中更改新bool
属性的定义:
private bool canChangeSelection = false;
public bool CanChangeSelection
{
get { return canChangeSelection; }
set
{
canChangeSelection = value;
if (!canChangeSelection)
{
if (SelectionChangedHandler != null) ComboBox1.SelectionChanged -=
SelectionChangedHandler;
}
else if (SelectionChangedHandler == null) ComboBox1.SelectionChanged +=
SelectionChangedHandler;
}
}
我个人更喜欢第一种方法,因为它更简单。