C# 动态绑定图像源
我想为我的WP8应用程序创建一个函数,告诉用户GPS信号是否正在初始化、准备就绪等。我想用一张小图片,如果仍在搜索,则用问号,如果没有数据,则用X,如果OK,则用复选标记。我正在使用MVVM Light 以下是我到目前为止的情况: 在我看来,我有以下几行: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
...
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" />