动态绑定图像源

问题描述:

我想创建一个功能给我的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运行在后台线程,因为这我不能更新用户界面。

+1

你好像缺少一些INotifyPropertyChanged的? – 2014-09-29 16:15:23

+0

我认为如果需要,它会被Set()自动调用。 – fzl 2014-09-29 16:20:40

+0

我认为它将其称为Signalstrength的改变,而不是它的子属性。因为,你的代码对我来说是正确的。我没有与我atm的手机来真正地测试它。 – 2014-09-29 16:33:28

这是你的新模式

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 2014-09-29 18:03:03

+0

在转换器的else分支中放置一个断点,并在switch语句中放置一个断点,也许删除else分支。确保你在App.xaml.cs中初始化Geolocator,如果它是null,它会去else分支。它看起来应该像public Geolocator Geolocator = new Geolocator(); – Faisal 2014-09-29 18:22:15

+0

当我第一次运行时,程序正常运行。问题是当我开始获得我的职位时,程序甚至没有输入到Converter代码中。 – fzl 2014-09-29 19:15:18