0

我有一个带有 Window 的 WPF 应用程序,并且不同的 UserControls 一一显示在其中,无需单击按钮。

我从文件中导入数据,所有数据都存储在一个公共对象“ImportExportData”中。所有用户控件都绑定到 ImportExportData 类的相应属性(作为自定义对象,如 Data1、Data2...)。

在我的 USerControl 中,我有 NumberZones 属性的组合框,这些 SelectionChanged 事件分别被处理。在此组合框的 SelectionChanged 事件中,根据选择的数量,将许多行添加到 Data2 属性的 ObservableCollection。

在导入数据并将导入的对象 (Data2) 设置为 USerControl2 的 DataContext 时,它将 NumberZones 属性值设置为相应的组合框,并且按应有的方式触发 SelectionChanged 事件。此时,对象已经在 ObservableCollection 中包含 reqd 行,此事件不应添加它。

父窗口有一个标志“importedData”,告诉我该对象已导入。但是一旦加载了 UserContrl2,我就不能让它为假,因为它们是他们的 UC,将跟随 UC2。在 UC2 中,我可以创建另一个标志“正在导入”,并在加载所有 UI 后将其设为 false。通过哪个 UC 事件,我可以知道 UI 已加载,从而使“导入”为假?

我想知道如何避免在导入的对象填充 UI 组件时触发 SelectionChanged 事件。在这种情况下,UserControl 的哪个事件可能会帮助我在 USerControl2 中保留一个标志。

任何想法,请提出建议。

4

1 回答 1

1

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

通过哪个 UC 事件,我可以知道 UI 已加载,从而使“导入”为假?

查看 MSDN 上的FrameworkElement.Loaded 事件页面。

我想知道如何避免在导入的对象填充 UI 组件时触发 SelectionChanged 事件。

有两种方法可以实现这个目标......第一种方法不会阻止事件触发,而是在导入数据时忽略它。基本上涉及暂时取消订阅该SelectionChanged事件,然后重新订阅它。如果我对您的理解正确,您bool的父母中有一个属性,您Window的sSelectionChanged中有处理程序UserControl...首先,您可以bool为每个 s 添加一个属性UserControl

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事件,然后重新订阅它。对于此选项,我们需要bool在您的每个 s 中更改新属性的定义UserControl

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;
    }
}

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

于 2013-08-30T12:21:44.093 回答