Я хочу создать функцию для своего приложения 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 работает в фоновом потоке, из-за этого я не могу обновить пользовательский интерфейс.
Похоже, вы пропустили некоторые INotifyPropertyChanged? –
Я думаю, что это автоматически вызывается Set(), если это необходимо. – fzl
Я думаю, что он называет это изменением Signalstrength, а не его свойствами. Потому что ваш код выглядит правильно для меня. У меня нет моего телефона со мной, чтобы действительно проверить его. –