Изображение не будет отображаться после передачи экземпляра ImageSource из одной ViewModel в другую - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь сделать простую головоломку. Сначала пользователь импортирует фотографию из своей библиотеки, затем отображается изображение, позволяющее пользователю подтвердить, что это именно то, что он хочет использовать. Затем он нажимает кнопку «Play», которая открывает новую страницу контента, которая также должна отображать точно такое же изображение.

Я использую MVVM в этом проекте.

Первый ContentPage имеет изображение, которое связано со свойством ImageSource в ViewModel.

Когда установлен ImageSource, он также копируется в класс SharedData.

Когда пользователь нажимает кнопку «Воспроизвести», загружается новый ContentPage, и то же самое изображение должно появляться при загрузке ImageSource из класса SharedData.

Однако этого не происходит!

Кто-нибудь может понять, что я делаю не так?

Проще говоря, я просто хочу поделиться изображением между ViewModels (классами) очень простым способом. Задача не в том, чтобы настроить сложную архитектуру. Я просто хочу, чтобы эта маленькая штука сработала.

StartViewModel:

        // Image
    private ImageSource _imageSource = "";
    public ImageSource ImgSource
    {
        get { return _imageSource; }
        set
        {
            _imageSource = value;
            SharedData.ImageSource = value;
            OnPropertyChanged();

        }
    }

XAML:

            <Image Margin="0,100,0,0" Source="{Binding ImgSource}" BackgroundColor="Black"></Image>

Это прекрасно работает, однако при передаче ImageSource в класс SharedData или как Параметр в MainViewModel работает неправильно

MainViewModel (второе представление):

        // Image
    private ImageSource _imageSource = "mouse.jpg";
    public ImageSource ImgSource
    {
        get { return _imageSource; }
        set
        {
            _imageSource = value;
            OnPropertyChanged();

        }
    }


    public MainViewModel()
    {
        SwapCMD = new CommandDelegate(action: x => { Console.WriteLine("Ignore this line"); }, executable: x => { return true; });

        ImgSource = SharedData.ImageSource;

    }

И, как вы можете видеть, я привязал ImageSource так же, как в предыдущий вид:

XAML:

        <Image Margin="0,100,0,0" Source="{Binding ImgSource}" BackgroundColor="Black"></Image>

Что я делаю не так? Почему я не могу просто передать источник другому представлению?

1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете попробовать код ниже. Я не уверен, почему вы используете класс SharedData для хранения источника изображений в первый раз. Но когда вы передаете источник изображения из одной модели просмотра в другую, вы можете передать его напрямую.

StartPage.xaml

 <StackLayout>
        <Image
            Margin="0,100,0,0"
            BackgroundColor="Black"
            Source="{Binding ImgSource}" />
        <Button
            x:Name="btnPlay"
            Clicked="btnPlay_Clicked"
            Text="Play" />
    </StackLayout>

StartViewModel.cs

public class StartViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private ImageSource _imageSource = "";
    public ImageSource ImgSource
    {
        get { return _imageSource; }
        set
        {
            _imageSource = value;                
            OnPropertyChanged("ImgSource");
        }
    }

    public StartViewModel()
    {
        ImgSource = "pink.jpg";
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

StartPage .xaml.cs

  public StartPage()
    {
        InitializeComponent();

        this.BindingContext = new StartViewModel();
    }

    private async void btnPlay_Clicked(object sender, EventArgs e)
    {
        await Navigation.PushAsync(new MainPage());
    }

MainPage.xaml

  <StackLayout>
    <!--  Place new controls here  -->
    <Image
        Margin="0,100,0,0"
        BackgroundColor="Black"
        Source="{Binding ImgSource}" />

</StackLayout>

MainViewModel.cs

 public class MainViewModel : INotifyPropertyChanged
{
    // Image
    private ImageSource _imageSource = "";

    public event PropertyChangedEventHandler PropertyChanged;

    public ImageSource ImgSource
    {
        get { return _imageSource; }
        set
        {
            _imageSource = value;
            OnPropertyChanged("ImgSource");

        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public MainViewModel()
    {
        //SwapCMD = new CommandDelegate(action: x => { Console.WriteLine("Ignore this line"); }, executable: x => { return true; });

        ImgSource = new StartViewModel().ImgSource;

    }
}

MainPage.xaml.cs

 public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new MainViewModel();
    }

App.xaml.cs

   MainPage = new NavigationPage(new StartPage());

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...