2014-09-29 2 views
0

Я хочу создать функцию для своего приложения WP8, которое сообщает пользователю, что сигнал GPS инициализируется, готов и т. Д. Я хочу сделать это с помощью маленькой картинки, вопросительный знак, если все еще выполняется поиск, X, если нет данные и галочку, если ОК. Я работаю с MVVM Light.Синхронизировать источник изображения динамически

Вот то, что я до сих пор:

На мой взгляд, у меня есть такие строки:

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

я создал конвертер:

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; 
    } 

В классе ViewModel:

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); 
      } 
     } 
    } 

При запуске приложения он работает нормально, но только один раз. Если я запустил Geolocator в моей MainPage, я вижу, что он нашел мою позицию, поэтому статус должен быть в порядке, но изображение по-прежнему является образцом вопросительного знака, а не галочкой.

Что мне не хватает? Как сделать, чтобы обновить изображение? И, наконец, подход, который я пытался реализовать, соответствует требованиям MVVM?

EDIT: Я не знаю, если это может быть проблемой, но у меня есть 3 ViewModels: MainViewModel, WorkoutViewModel и SignalViewModel. В моей MainPage, я показываю это так:

<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, я использую его для панели приложений. Если пользователь нажимает кнопку AppbarButton, я включаю GPS. Таким образом, код находится в MainViewModel, но элементы для отображения этих изменений находятся в SignalViewModel. Это может быть проблема?

EDIT2: Кажется Geolocator работает в фоновом потоке, из-за этого я не могу обновить пользовательский интерфейс.

+1

Похоже, вы пропустили некоторые INotifyPropertyChanged? –

+0

Я думаю, что это автоматически вызывается Set(), если это необходимо. – fzl

+0

Я думаю, что он называет это изменением Signalstrength, а не его свойствами. Потому что ваш код выглядит правильно для меня. У меня нет моего телефона со мной, чтобы действительно проверить его. –

ответ

0

Это ваша новая модель

public class Signalstrength : ObservableObject 
    { 
     private PositionStatus _state;  

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

В конструкторе модели представления

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

Это мнение

... 
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. Убедитесь, что вы инициализируете Geolocator в App.xaml.cs, если он равен null, он перейдет в ветвь else. Он должен выглядеть как публичный Geolocator Geolocator = new Geolocator(); – Faisal

+0

Программа работает правильно, когда я запускаю первый раз. Проблема в том, что когда я начинаю приобретать свою позицию, программа даже не входит в код конвертера. – fzl