웹 사이트에서 기사 링크를 다운로드하여 눈금으로 표시하는 WPF 응용 프로그램을 작성 중입니다. 문제의WPF에서 데이터 격자를 동적으로 업데이트
요약 :
내가 타격하고있어 문제는 내가 내 뷰 모델에 정의 된 데이터 그리드에 바인딩 된 ObservableCollection에 기사에 대한 액세스 (하지 않는 모델의 논리를 다운로드 한 것입니다).
새로운 기사를 다운로드 할 때이 컬렉션을 업데이트하려면 어떻게해야합니까? (데이터 그리드가 새로운 기사를 하나씩 계속 추가 할 수 있도록)
세부 사항 :
여기에 (내가 쉽게 읽을 유지하기 위해하지 않는 것이 중요 부품의 일부를 잘라) MVVM 패턴을 구현하는 내 응용 프로그램의 개요입니다 :
DisplayWindow.xaml 가 바인딩 소스가 PresenterViewModel.cs와 ItemSource가 ObservableCollection에 어떤 기사로 설정 그것은 또한 문서의 다운로드를 트리거 버튼이
<Grid DataContext="{Binding Source={StaticResource presenterViewModel}}">
<DataGrid ItemsSource="{Binding Articles}">
<DataGrid.Columns>
<DataGridTextColumn Header="Url" Binding="{Binding Url}"/>
...
</DataGrid.Columns>
</DataGrid>
</Grid>
(아래 참조)
<Button Content="Download" Command="{Binding DownloadArticles, Mode=OneWay}"/>
DownloadArticles 방법을 통해 링크 PresenterViewModel의 일부이며 ICommand의 인터페이스를 구현 DownloadCommand의 인스턴스를 리턴한다.
PresenterViewModel.cs
contains ObservableCollection<Article> Articles
private ObservableCollection<Article> articles;
public ObservableCollection<Article> Articles
{
get { return articles; }
set
{
articles = value;
RaisePropertyChangedEvent("Articles");
}
}
public ICommand DownloadArticles
{
get
{
return downloadCommand;
}
}
DownloadCommand는 PresenterViewModel과는 제 모델 자체 DownloadArticles를 호출하는 방법 DownloadArticles을의 방법은 호출 실행에 대한 참조를 포함합니다. DownloadCommand.cs에서
:
public void Execute(object parameter)
{
presenterViewModel.DownloadArticles();
}
솔루션 나는 생각했다 :
자, 문제는 내가 Article.cs 모델 DownloadArticles 방법에있어 및 ObservableCollection에 기사를 업데이트해야되는 PresenterViewModel의 일부입니다 ... 어떻게해야합니까? DownloadArticles 메서드는 별도의 스레드에서 다운로드 논리를 실행합니다.
PresenterViewModel에 대한 참조를 모델의 DownloadArticles 메서드에 전달해야합니까?
이것은 쉽게 할 수있는 것처럼 보이지만 모델이 ViewModel에 연결되어야한다고 생각하지 않습니다.이 경우 메소드 중 하나에서 PresenterViewModel 객체를 사용할 수 있습니다.
또 다른 옵션은 PresenterViewModel에서 직접 로직을 다운로드하는 것이지만 내 ViewModel을 경량으로하고 로직을 포함하지 않기를 바라는 한 느낌이 들지 않습니다.
이 경우 가장 좋은 해결책은 무엇입니까? 내 아키텍처가 근본적으로 잘못되었다고 생각한다면,이 경우 구조화의 가장 좋은 방법이 무엇인지 알려 주시기 바랍니다.
정말 고맙게 생각합니다.
프로세스를 처리하기 위해 중간에 DLL이 필요하다고 생각됩니다. 다운로더는 뷰 모델에 대해 알지 못하며 반대의 경우도 마찬가지입니다. –
모델에서 이벤트를 격렬하게해야 할 수도 있습니다. 그리고 뷰 모델에서 구독하십시오. –
당신의'Command'는'VM'에 있어야하고 당신의 다운로더는'Model'에 있어야합니다. 귀하의'VM' 모델에 대한 참조가 있어야합니다. 이 방법은 Model과 ViewModel 간의 통신에 문제가 없으며 MvvM이 작동하는 방식입니다. – XAMlMAX