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中保留一个标志。

有什么想法、建议吗。

WPF C#导入时如何避免事件触发

很难理解你的所有问题,所以请耐心等待……我会解决我理解的每一点。

通过哪个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;
    }
}

我个人更喜欢第一种方法,因为它更简单。