2014-02-12 6 views
0

나는이 권한을 묻는 것조차 생각하지 않지만 여기서는 간다. 정보의 DataGrid를 표시하는 .NET CF 앱이 있습니다. 이 응용 프로그램은 정기적으로 데이터를 브로드 캐스트하는 중앙 서버에 TCP 소켓에 연결됩니다.TCP 소켓에서 데이터를받은 후 UI를 업데이트하십시오.

내 ShellForm에서 내 DataGrid를 업데이트하려면 어떻게해야합니까? SALP가 발생하는 DAL에서 ShellForm에 대한 참조가 잘못되었습니다.

위임 또는 비동기 콜백을 사용합니까? 그냥 약간의 지침을 찾고. 감사!

답변

2

DAL은 단지 publish an Event 일 수 있으며 GUI를 구독 할 수 있습니다.
참조 (및 종속성)는 GUI에서 DAL로 변경됩니다.

나사산 안전 장치도 살펴보십시오.

+0

나만의 이벤트를 만들 수 있습니까? 감사! 나는 그것을 주위에 Google거야. Compact Framework가 더 어려운 이유는 무엇입니까? 그게 지금까지 제가 경험 한 경험이었습니다. CF에 대한 정보를 찾기는 어렵지만, 그럴 필요가 없다면 더 나은 정보를 얻을 수 있습니다. –

+0

CF는 조금 오래되었고 인기가 없습니다. 이벤트는 정상적으로 작동해야합니다. 링크를 추가하겠습니다. –

+0

고마워, 나는이 질문에 꽤 대답한다고 생각한다. 문제가 생겼지 만이 경우 DAL이 '정적'인 것과 관련 있다고 생각합니다. 그것은 단지 다양한 소켓 기록을 보내기위한 것입니다. 어쨌든 이것을 정적 이벤트로 구현했지만 UI를 업데이트하면 System.NotSupportedException가 발생합니다 : Control.Invoke를 사용해야합니다 ... –

2

귀하의 UI가 귀하의 DAL에 대해 전혀 모르는 것이 좋습니다. 이것을 위해 DAL을 감시하고 이벤트, 콜백 또는 기타를 통해 UI에 알릴 수있는 중간 "발표자"클래스를 만드는 것이 좋습니다.

나는 이벤트를 직접 보거나 그리드를 채우는 데 사용중인 속성에 데이터 바인딩을 허용하는 INotifyPropertyChanged를 구현하는 표현 자 클래스를 만들 가능성이 큽니다. 발표자는 UI 컨텍스트에 마샬링을 처리하기 때문에 UI 나 DAL 모두 걱정할 필요가 없습니다.

일부 종류의 유사 코드는 다음과 같을 수 있습니다. 내 코드에는 여러 가지 인프라 비트가 있습니다. 따라서이 코드는 컴파일 할 가능성이 없지만 문제를 공격 할 수있는 방법을 제공해야합니다.

class PointPresenter : INotifyPropertyChanged 
{ 
    private IDataService DAL { get; set; } 

    protected Control EventInvoker { get; private set; } 

    public PointPresenter() 
    { 
     // get your DAL reference however you'd like 
     DAL = RootWorkItem.Services.Get<IDataService>(); 
     EventInvoker = new Control(); 
     // this is required to force the EE to actually create the 
     // control's Window handle 
     var h = EventInvoker.Handle; 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     try 
     { 
      if (m_disposed) return; 

      EventInvoker.BeginInvokeIfRequired(t => 
      { 
       try 
       { 
        PropertyChanged.Fire(this, propertyName); 

       } 
       catch (Exception e) 
       { 
        Debug.WriteLine(e); 
       } 
      }); 
     } 
     catch (ObjectDisposedException) 
     { 
      // if the Form to which we're sending a message is disposed, 
      // this gets thrown but can safely be ignored 
     } 
     catch (Exception ex) 
     { 
      // TODO: log this 
     } 
    } 

    public int MyDataValue 
    { 
     get { return DAL.Data; } 
     set 
     { 
      if (value == MyDataValue) return; 
      DAL.Data = value; 
      RaisePropertyChanged("MyDataValue"); 
     } 
    } 
} 
+0

위대한 코드이지만 초보자에게 너무 큽니다? – josef

+0

나는 완전히 반대하고 싶다. 실제로 초보자는 모든 책과 튜토리얼에서 볼 수있는 디자이너가 생성 한 UI 코드에서 직접 DAL 액세스와 같은 것보다 더 나은 아키텍처를보아야하는 사람이 있습니다. 그 이유는 그것이 나쁜 코드와 단절된 것이기 때문에 그 습관이 더 좋다. – ctacke