2009-08-18 29 views
1

我有我的第一個WPF做工精細用的ObjectDataProvider在XAML:如何不使用ObjectDataProvider?

<ObjectDataProvider x:Key="WaitingPatientDS" ObjectType="{x:Type local:clsPatients}"> 
    <ObjectDataProvider.ConstructorParameters> 
     <sys:Boolean>True</sys:Boolean> 
    </ObjectDataProvider.ConstructorParameters> 
</ObjectDataProvider> 

不過,我不喜歡使用這個,因爲如果有一個連接錯誤,我不能捕獲它和程序公正出去吧。

所以,我一直試圖做的是直接實例集合對象的代碼隱藏...

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 
    clsPatients oPatients; 

public MainWindow() 
{ 
    oPatients = new clsPatients(true); 

...然後在我的數據綁定引用它像這樣:

<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3" 
    DataContext="{Binding Mode=OneWay, Source={StaticResource local:oPatients}}"> 

但是,我得到「本地:oPatients沒有找到」。

那麼......我在做這件事的時候做錯了什麼和/或其他人如何完成這個數據綁定,這樣我就可以實際捕獲連接錯誤並將主窗體轉移到用戶友好的錯誤窗體中?

謝謝!

+0

+ 1 - 標記中的ODS和SQL Params總讓我感覺不到新鮮感。我已經成功地完成了ReportDataSourses的代碼,但從來沒有得到這個難以捉摸的ODS的工作。 – 2009-08-18 13:20:53

回答

2

我會將數據訪問邏輯移入一個單獨的服務中,並且可能將其移入其自己的程序集中,以完全實現您想要分離的問題。然後我有一個視圖模型使用上述服務來檢索數據並將其展示給視圖。然後,視圖將簡單地綁定到視圖模型,並不在乎數據是來自數據庫還是其他任何東西。

我建議閱讀關注點分離,服務定位器/依賴注入和MVVM。

+0

希望我有時間的兄弟,希望我有時間! ;) – LSTayon 2009-08-18 17:07:02

+0

那麼,誰繼承你的代碼將希望同樣的事情;) – 2009-08-18 23:07:27

2

你會得到該錯誤,因爲oPatients不是StaticResource。它必須在ResourceDictionary中以ObjectDataProvider的方式定義,但作爲類成員則不是。你可以公開爲公共財產:

public clsPatients Patients { get; set; } 

然後直接綁定到它:

<!-- MainWindowRoot is the x:Name of your Window element. --> 
<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3" 
    DataContext="{Binding Patients, ElementName=MainWindowRoot, Mode=OneWay}"> 

假設我沒有做了一些愚蠢的錯誤,應該工作。但是,它仍然不能解決您的問題,因爲您正在構造函數中加載數據,這意味着任何異常都將導致clsPatients構造失敗,這反過來會導致MainWindow構造失敗,這是您無法正確處理的,因爲它是堆棧跟蹤旁邊的老鼠與正常的建築失敗沒有區別。

肯特是100%正確的:數據應該來自外部供應商。

您可能有資源限制,但即使無法實施分層體系結構,您仍然可以建立良好的設計。最起碼,通過將數據加載到單獨的數據提供者類中,然後將完整形成的數據傳遞到窗口中來建立關注點分離。這可以讓你在發生錯誤的地方隔離,並讓你的代碼更加鬆散地耦合。

public class PatientDataProvider 
{ 
    public PatientDataProvider(WhatItNeedsToConnect whatItNeedsToConnect) 
    { 
     // this doesn't connect because the constructor shouldn't fail because of a connection failure 
    } 
    public clsPatients GetPatientData(bool yesOrNo) 
    { 
     // this can fail because of a connection error or some other data loading error 
    } 
} 

並調用它爲:

PatientDataProvider provider = new PatientDataProvider(whatItNeedsToConnect); 
clsPatients patients = null; 
try { 
    patients = provider.GetPatientData(true); 
    MainWindow w = new MainWindow { Patients = patients; }; 
    w.Show(); 
} 
catch (WhateverExceptionGetsThrownByProvider e) 
{ 
    MessageBox.Show("Could not load patients: " + e.Message); 
} 

而且,如果clsPatients是自刷新,確保它實現INotifyPropertyChangedINotifyCollectionChanged適當,以便約束性指標,以數據改變時更新。

相關問題