귀하의 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");
}
}
}
나만의 이벤트를 만들 수 있습니까? 감사! 나는 그것을 주위에 Google거야. Compact Framework가 더 어려운 이유는 무엇입니까? 그게 지금까지 제가 경험 한 경험이었습니다. CF에 대한 정보를 찾기는 어렵지만, 그럴 필요가 없다면 더 나은 정보를 얻을 수 있습니다. –
CF는 조금 오래되었고 인기가 없습니다. 이벤트는 정상적으로 작동해야합니다. 링크를 추가하겠습니다. –
고마워, 나는이 질문에 꽤 대답한다고 생각한다. 문제가 생겼지 만이 경우 DAL이 '정적'인 것과 관련 있다고 생각합니다. 그것은 단지 다양한 소켓 기록을 보내기위한 것입니다. 어쨌든 이것을 정적 이벤트로 구현했지만 UI를 업데이트하면 System.NotSupportedException가 발생합니다 : Control.Invoke를 사용해야합니다 ... –