저는 C#/WPF/Entity Framework DB에서 먼저 냉각수 선의 흐름 및 온도와 같은 값을 측정하는 독점 산업 하드웨어와 통신하는 응용 프로그램을 작성하고 있습니다. 이러한 값은 SQL Server 데이터베이스에서 백그라운드에서 실행되는 스레드로 자주 업데이트 된 다음 내 UI에 표시됩니다.데이터베이스 변경 사항으로 WPF UI를 업데이트하는 방법
내 관심사는 현재 이러한 변경 사항을 반영하기 위해 UI를 업데이트하는 방법입니다. 매 초마다 실행합니다
내 ViewModel에 내 데이터 컨텍스트를 설정하고, 스레드를 인스턴스화 : 여기가 데이터 그리드를 업데이트하는 방법의 예
이_DataContext = new ViewModels.SummaryTable_ViewModel();
this.DataContext = _DataContext;
UIUpdateThread = new Thread(UIUpdaterThread);
UIUpdateThread.IsBackground = true;
UIUpdateThread.Start();
내 그리드의 기반이되는 모델은 IList의 <됩니다> 그것은 다음과 같습니다
private IList<channel> _channel;
public IList<channel> Channels
{
get
{
return _channel;
}
set
{
_channel = value;
//NotifyPropertyChanged();
OnPropertyChanged("Channels");
}
}
그런 다음 매 초마다 내 UIUpdateThread은 다음과 같다() 메소드 내 FillChannels를 호출 한 후하여 PropertyChanged 알림을 기반으로 그리드 업데이트 :
using (var DTE = new myEntities())
{
if (DTE.channels.Any())
{
var q = (from a in DTE.channels
where a.setup.CurrentSetup == true
orderby a.ChannelNumber
select a).ToList();
this.Channels = q;
}
}
제 질문은 이것입니다. 더 좋은 방법이 있습니까? 이것은 더 나은 용어가 부족하여 "잘못"하다고 느낍니다. 그리고 스레드가 실행될 때마다 내 데이터 그릿에서 사용자 집합 정렬을 재설정하는 것과 같은 나쁜 부작용이 있습니다. 또한 MVVM 패턴이 깨지는 것은 확실하지만 확실하지 않습니다.
예를 들어 하드웨어에서 데이터를 찾기 위해 하드웨어를 폴링 할 때마다 내 하드웨어와 통신하는 스레드가 공유 채널 객체를 업데이트하고 UI 만 바인딩하면 어떻게 될지 생각하고 있습니다. 이 스레드 (또는 동일한 작업을 수행하는 다른 UI의 다른 스레드)를 실행하고 PropertyChanged 알림을 기반으로 업데이트하면됩니다. 아니면 내가 완전히 알지 못하는 다른 방법이 있습니까? 대답을 검색 할 때 내가 익숙하지 않은 작업 단위 패턴에 대한 언급이 여기에 관련 개념입니까?
여기서 알 수 있듯이, 나는 여기에서 어디로 가야할지 잘 모르겠다. 그리고 실제로 도움을받을 수있다. 텍스트의 벽에 죄송합니다. 가능한 한 철저히하고 싶었습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사.
시작하려면 '채널'을 'ObservableCollection'으로 만듭니다. 항목이 추가되거나 제거되면 컬렉션을 다시 만드는 대신 항목을 추가/제거합니다. 일반적으로 두 번째 단락부터 마지막 단락까지는 돈이됩니다 : 적절한 변경 통보를하는 기존의 변경. 전체적으로 새로운 현재 상태에서 단순히 뛰어 드는 것과 관련하여 다소 엉키지 만, 그렇게해야 할 경우, 그렇게해야합니다. P.S .: rory.ap이 말한 것. –
도움 주셔서 감사합니다. @EdPlunkett – user3900520