2014-09-29 3 views
0

GPS 신호가 활성화되어 있는지 알려주는 WP8 애플리케이션에 함수를 생성하고 싶습니다. 작은 그림, 질문 표시가 있으면 X를 표시하고,없는 경우 X를 표시합니다. 데이터 및 확인 표시가 있으면 OK를 누릅니다. MVVM Light로 작업하고 있습니다. 뷰 모델 클래스에서동적으로 이미지 소스 바인딩

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string path = System.Convert.ToString(value); 

     if (App.Geolocator != null) 
     { 
      switch (App.Geolocator.LocationStatus) 
      { 
       case Windows.Devices.Geolocation.PositionStatus.Disabled: 
        path = "/Assets/close.png"; 
        break; 
       case Windows.Devices.Geolocation.PositionStatus.Initializing: 
        path = "/Assets/questionmark.png"; 
        break; 
       case Windows.Devices.Geolocation.PositionStatus.NoData: 
        path = "/Assets/close.png"; 
        break; 
       case Windows.Devices.Geolocation.PositionStatus.NotAvailable: 
        path = "/Assets/close.png"; 
        break; 
       case Windows.Devices.Geolocation.PositionStatus.NotInitialized: 
        path = "/Assets/questionmark.png"; 
        break; 
       case Windows.Devices.Geolocation.PositionStatus.Ready: 
        path = "/Assets/check.png"; 
        break; 
       default: 
        path = "/Assets/close.png"; 
        break; 
      } 
     } 
     else 
     { 
      path = "/Assets/questionmark.png"; 
     } 

     return path; 
    } 

: 나는 변환기를 만든

... 
DataContext="{Binding Signal, Source={StaticResource Locator}}"> 
... 
<Image Source="{Binding Signalstrength.Imageuri, Converter={StaticResource SignalstatusConverter}}" Width="38" Height="38" HorizontalAlignment="Right" Grid.Column="1" /> 

:

내보기에

, 나는이 라인을 가지고 : 여기

는 내가 지금까지 무엇을 가지고 :

public class SignalViewModel : ViewModelBase 
{ 
    private Signalstrength _signalstrength;   

    public Signalstrength Signalstrength 
    { 
     get { return _signalstrength; } 
     set 
     { 
      _signalstrength = value; 
      Set("Signalstrength", ref _signalstrength, value); 
     } 
    } 
    public SignalViewModel() 
    { 
      _signalstrength = new Signalstrength 
      { 
       Imageuri = "/Assets/questionmark.png", 
       State = "initializing" 
      }; 

    } 
} 

모델 :

public class Signalstrength : ObservableObject 
    { 
     private string _state; 
     private string _imageuri;   

     public string State 
     { 
      get { return _state; } 
      set 
      { 
       _state = value; 
       Set("State", ref _state, value); 
      } 
     } 

     public string Imageuri 
     { 
      get { return _imageuri; } 
      set 
      { 
       _imageuri = value; 
       Set("Imageuri", ref _imageuri, value); 
      } 
     } 
    } 

응용 프로그램을 실행할 때 제대로 작동하지만 한 번만 실행됩니다. 내 MainPage에서 Geolocator를 시작하면 내 위치를 찾았으므로 Status는 OK 여야하지만 이미지는 여전히 체크 표시가 아니라 Questionmark 이미지입니다.

무엇이 누락 되었습니까? 이미지를 새로 고치려면 어떻게해야합니까? 마지막으로 MVVM 요구 사항을 충족시키기 위해 구현 한 방법이 있습니까?

편집 : 이 문제가 될 수 있다면 나도 몰라,하지만 난 3 ViewModels 있습니다 MainViewModel, WorkoutViewModel 및 SignalViewModel을. 내 메인 페이지에서 다음과 같이 표시합니다.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
      <views:WorkoutView IsHitTestVisible="False" /> 
     </Grid> 
     <Grid Grid.Row="2"> 
      <views:SignalstrengthView IsHitTestVisible="False" /> 
     </Grid> 

해당 뷰에서 DataContext를 설정합니다. MainViewModel은 MainPage 용이며 Applicationbar 용으로 사용합니다. 사용자가 AppbarButton을 클릭하면 GPS가 켜집니다. 이 코드는 MainViewModel에 있지만이 변경 사항을 표시 할 항목은 SignalViewModel에 있습니다. 이것이 문제가 될 수 있습니까?

EDIT2 : 그것은이의 나는 UI를 업데이트 할 수 없기 때문에 Geolocator는 백그라운드 스레드에서 실행 보인다.

+1

가 보이는되는 뷰 모델

_signalstrength = new Signalstrength { State = Windows.Devices.Geolocation.PositionStatus.Disabled }; 

의 생성자에서 새 모델

public class Signalstrength : ObservableObject { private PositionStatus _state; public PositionStatus State { get { return _state; } set { _state = value; Set("State", ref _state, value); } } } 

입니까? –

+0

필요할 경우 Set()이 자동으로 호출한다고 생각합니다. – fzl

+0

나는 Signalstrength에 대한 변경으로 그것을 부른다라고 생각한다. 왜냐하면, 당신의 코드가 나에게 맞아 보이기 때문입니다. 나는 정말로 그것을 테스트하기 위해 atm과 나의 전화가 없다. –

답변

0

이 일부에서 INotifyPropertyChanged 누락있는 것처럼이 뷰

... 
DataContext="{Binding Signal, Source={StaticResource Locator}}"> 
... 
<Image Source="{Binding Signalstrength.State, Converter={StaticResource SignalstatusConverter}}" Width="38" Height="38" HorizontalAlignment="Right" Grid.Column="1" /> 
+0

나는 이것을 시도했지만 아직 업데이트하지 않았다. – fzl

+0

변환기의 else 분기와 switch 문의 하나에 중단 점을 넣고 else 분기를 제거하십시오. App.xaml.cs에서 Geolocator를 초기화했는지 확인하십시오. Geolocator가 null 인 경우 else 분기로 넘어갑니다. 그것은 공개처럼 보일 것입니다. Geolocator Geolocator = new Geolocator(); – Faisal

+0

처음 실행하면 프로그램이 제대로 작동합니다. 문제는 내가 자신의 직책을 획득하기 시작하면 프로그램이 변환기 코드에도 들어 가지 않는다는 것입니다. – fzl