2013-08-30 48 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