簡體   English   中英

動態綁定圖像源

[英]Bind image source dynamically

我想為我的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,我會看到它找到了我的位置,因此狀態必須為OK,但是該圖像仍然是問號圖像,而不是復選標記。

我想念什么? 我該如何刷新圖像? 最后,我嘗試實現的方法是否符合MVVM要求?

編輯:我不知道這是否可能是一個問題,但我有3個ViewModel: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,我將其用於Applicationbar。 如果用戶單擊AppbarButton,則打開GPS。 因此該代碼位於MainViewModel中,但用於顯示這些更改的項目位於SignalViewModel中。 這可能是個問題嗎?

EDIT2:看來Geolocator在后台線程中運行,因此,我無法更新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" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM