2009-08-18 3 views
1

는 내가 처음으로 WPF는 XAML에 ObjectDataProvider와 함께 잘 작동이 : 나는이 때문에이 경우 연결 오류를 사용하여 좋아하지 않아,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를 결코 얻지 못했습니다. –

답변

2

데이터 액세스 논리를 별도의 서비스로 이동하고 의도 된 분리 문제를 적용하기 위해 자체 어셈블리로 옮길 수 있습니다. 그런 다음 뷰 모델에서 해당 서비스를 사용하여 데이터를 검색하고이를 뷰에 표시합니다. 그런 다음 뷰는 단순히 뷰 모델에 바인딩되며 데이터가 데이터베이스 또는 기타에서 온 것인지 여부는 신경 쓰지 않습니다.

나는 서비스 분리 자, 서비스 로케이터/종속성 주입 및 MVVM에 대한 정보를 읽는 것이 좋습니다.

+0

소원 나는 시간 동생이 있었으면 좋겠다. ;) – LSTayon

+0

자, 코드를 상속받은 사람은 똑같은 것을 원할 것입니다;) –

2

oPatientsStaticResource이 아니므로이 오류가 발생합니다. ObjectDataProvider의 방식으로 ResourceDictionary에 정의되어야하지만, 클래스 멤버로는 그렇지 않습니다. 당신은 공공 재산으로 노출 될 수 있습니다 :

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

과 같이 호출 : clsPatients 자기 상쾌 경우, 또한

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

, 그것은 데이터가 변경 바인딩 대상을 업데이트하기 위해서는 INotifyPropertyChanged 또는 적절한 INotifyCollectionChanged를 구현해야합니다.

관련 문제