2017-12-13 2 views
1

MVVM 아키텍처를 사용할 때 큰 문제가 발생했습니다. 직접적으로 언급하거나 언급하지는 않았습니다. 멀티 스레드 응용 프로그램에서는 뷰 모델이 완전히 구성되기 전에 뷰에서 데이터 바인딩을 시작하여 바인딩 실패를 만들 수 있습니다. 뷰 모델이 구축 된 후 데이터 바인딩이 수행되도록하려면 어떻게해야합니까?

public class StocksViewModel 
{ 

    // blah blah 

    public IOrderedEnumerable<KeyValuePair<string, string>> AvailableStocks 
    { 
     get 
     { 
      // This could take a minute or two 
      return StockService.GetAvailableStocks(User); 
     } 
    } 

    public double Quantity 
    { 
     get => Quantity; 
     set 
     { 
      Quantity = value; RaisePropertyChanged(nameof(Quantity)); 
     } 
    } 

    public double Symbol 
    { 
     get => Symbol; 
     set 
     { 
      Symbol = value; RaisePropertyChanged(nameof(Symbol)); 
     } 
    } 
} 

여기 theXAML입니다 : 당신이 볼 수 있듯이

 <ComboBox x:Name="Quantity" Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=ViewModel.Quantity}" DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="{x:Bind ViewModel.AvailableStocks}" /> 

     <ComboBox x:Name="Symbol" Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=ViewModel.Symbol}" DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="{x:Bind ViewModel.AvailableStocks}" /> 

하면, 데이터 바인딩은 예측할 수 없습니다

여기가 예입니다. StockService에 몇 초가 걸리면 Quantity 및 Symbol은 AvailableStock에 데이터 바인딩 할 기회를 얻지 못합니다.

이 상황을 처리하기위한 규정 된 방법은 무엇입니까?

+0

Quantity와 Symbol은 AvailableStocks 속성과 어떻게 관련이 있습니까? Quantity 및 Symbol 속성에 대한 바인딩은 속성이 설정 될 때마다 새로 고쳐지기 때문에 실제로 사용자의 문제를 이해하지 못합니다. – mm8

답변

1

내 접근 방식은 여기에있는 경로와 다른 경로를 사용하는 것입니다. 내보기 모델의 생성자에서 readonly ObservableCollection<KeyValuePair<string, string>>을 만듭니다. 나는 그때 GetAvailableStocks에 전화하기 위해 새 스레드를 시작할 것이다. 결과가 반환되면 ObservableCollection을 채울 수 있습니다. 그러나 데이터를 검색하는 동안 사용자가 아직 결과를 수집하고 있다는 것을 알고 있으므로 로딩 아이콘이나 유사한 아이디어를 포함합니다.

뷰 모델은 가능한 모든 데이터를로드하고 수신 할 때마다 추가 데이터를 표시 할 준비가되어 있어야합니다. 데이터를 미리로드하여 뷰 모델에 전달할 수 있다면 더 좋을 수도 있지만 항상 발생하는 것은 아닙니다.

코드 샘플 (I 모바일에있어 나의 서식을 변명) :

public class ViewModel 
{ 
    readonly ObservableCollection<KeyValuePair<string, string>> _availableStocks; 

    public ObservableCollection<KeyValuePair<string, string>> AvailableStocks 
    { 
     get => _availableStocks; 
    } 
    public bool IsExecuting { get; set; } 

    public ViewModel() 
    { 
     _availableStocks = new ObservableCollection<KeyValuePair<string, string>>(); 
     IsExecuting = true; 
     TaskFactory.StartNew(() => 
     { 
      var results = StockService.GetAvailableStocks(User); 
      foreach (var stock in results) 
       AvailableStocks.Add(stock); 
      IsExecuting = false; 
     } 
    } 
} 

이 코드는 안된하지만 난 그게 문제와 함께 당신을 도울 것입니다 희망!

+0

당신은 소스와 김치가 없다면 굉장합니다. 마지막 질문 중 하나는 MVVM 프레임 워크에서이 잡아 문서를 작성합니까? 나는 직접 언급하거나 언급 한 것을 본 적이 없다. –

+1

@ATL_DEV MVVM 프레임 워크에서이 문서를 본 것으로 생각하지 않습니다. 비록 내가 프레임 워크를 관리한다면 그것을 문서화한다고 확신 할 수는 없다. 이것은 프레임 워크 질문에 반대되는 디자인 패턴 질문 일 것 같아요. 그러나, 나는 당신이 어디에서 오는지 알 수 있습니다. – techvice

+0

그래도, 특히 스레딩과 수명을 파악하지 못하는 개발자의 경우 놀라움으로 당신을 사로 잡는 문제 중 하나입니다. 당신의 해결책은 제가 생각한 것입니다. 그러나 저는 항상 제 자신을 추측합니다. –

관련 문제