C# 动态绑定图像源

C# 动态绑定图像源,c#,xaml,windows-phone-8,mvvm,mvvm-light,C#,Xaml,Windows Phone 8,Mvvm,Mvvm Light,我想为我的WP8应用程序创建一个函数,告诉用户GPS信号是否正在初始化、准备就绪等。我想用一张小图片,如果仍在搜索,则用问号,如果没有数据,则用X,如果OK,则用复选标记。我正在使用MVVM Light 以下是我到目前为止的情况: 在我看来,我有以下几行: ... DataContext="{Binding Signal, Source={StaticResource Locator}}"> ... <Image Source="{Binding Signalstrength.Ima

我想为我的WP8应用程序创建一个函数,告诉用户GPS信号是否正在初始化、准备就绪等。我想用一张小图片,如果仍在搜索,则用问号,如果没有数据,则用X,如果OK,则用复选标记。我正在使用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" />
在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);
            }
        }
    }
当我运行应用程序时,它工作正常,但只有一次。如果我在主页中启动地理定位器,我会看到它找到了我的位置,因此状态必须是OK,但图像仍然是问号图像,而不是复选标记

我错过了什么?我怎样才能刷新图像?最后,我尝试实现的方法是否符合MVVM要求

编辑: 我不知道这是否是个问题,但我有3个视图模型: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用于主页,我将其用于应用程序栏。如果用户单击AppbarButton,我将打开GPS。因此,代码在MainViewModel中,但显示这些更改的项目在SignalViewModel中。这可能是个问题吗

EDIT2: 地理定位器似乎在后台线程中运行,因此我无法更新UI。

这是您的新模型

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" />
。。。
DataContext=“{Binding Signal,Source={StaticResource Locator}}”>
...

看起来您缺少了一些INotifyPropertyChanged?我认为如果需要,Set()会自动调用它。我认为它会在对Signalstrength进行更改时调用它,而不是它的子属性。因为,你的代码在我看来是正确的。我没有带手机来真正测试它。@Chubosaurus我试图手动调用RaisePropertyChanged的软件,但仍然没有发生任何变化。您不需要转换器,只需将转换器逻辑移动到视图模型构造函数。在转换器的else分支中放一个断点,在switch语句中放一个断点,也许可以移除else分支。确保在App.xaml.cs中初始化Geolocator。如果它为null,它将转到else分支。它应该看起来像公共地理定位器Geolocator=new Geolocator();当我第一次运行时,程序在那里正常工作。问题是当我开始获取我的位置时,程序甚至没有输入转换器代码。
...
DataContext="{Binding Signal, Source={StaticResource Locator}}">
...
<Image Source="{Binding Signalstrength.State, Converter={StaticResource SignalstatusConverter}}" Width="38" Height="38" HorizontalAlignment="Right" Grid.Column="1" />