我想创建一个功能给我的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);
}
}
}
当我运行该应用程序时,它工作正常,但只是一次。如果我在MainPage中启动Geolocator,我发现它找到了我的位置,所以状态必须正常,但图像仍然是问号图像,而不是复选标记。
我错过了什么?我怎样才能刷新图像?最后,我试图实现这个方法符合MVVM的要求?
编辑: 我不知道这可能是一个问题,但我有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中。这可能是一个问题吗?
编辑2: 看来Geolocator运行在后台线程,因为这我不能更新用户界面。
你好像缺少一些INotifyPropertyChanged的? – 2014-09-29 16:15:23
我认为如果需要,它会被Set()自动调用。 – fzl 2014-09-29 16:20:40
我认为它将其称为Signalstrength的改变,而不是它的子属性。因为,你的代码对我来说是正确的。我没有与我atm的手机来真正地测试它。 – 2014-09-29 16:33:28