2013-08-30 22 views
0

我有一个WPF应用程序与一个窗口和不同的UserControls显示在它一个接一个没有按钮点击。WPF C#如何避免导入事件消息?

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

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

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

PArent窗口有一个标志“importedData”,告诉我该对象已导入。但是一旦UserContrl2被加载,我无法做到这一点,因为他们的UC将遵循UC2。在UC2中,我可以创建另一个标志“导入”,并在所有用户界面加载后都将其设为假。通过哪个UC事件我可以知道UI已加载,从而使“导入”为false?

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

任何想法,建议请。

+0

你使用mvvm还是在代码后面做事? – Nitin

+0

mvvm。在构造函数中设置UserControl的DataContext。 – Tvd

回答

1

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

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

查看MSDN上的FrameworkElement.Loaded Event页面。

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

有实现这个目标的双向...第一种方式不停止从触发事件,而是忽略其数据被导入时。基本上涉及暂时取消订阅SelectionChanged事件,然后重新订阅它。如果我的理解正确,那么您的中的WindowSelectionChanged处理程序中有一个bool属性...首先,你可以在bool属性添加到您的每个UserControl S的:

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

第二种方式主要涉及暂时unsubs从SelectionChanged事件中扣押,然后重新订阅它。对于此选项,我们需要改变我们的新bool属性的定义在每个UserControl S的:

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

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

+0

Sheridan,我也曾想到Loaded事件,并在Loaded事件上实施了“Window_Loaded”方法。但未能在用户控件上订阅Loaded事件。我实现了这一点,它的工作非常好。非常感谢。 – Tvd