Медиа-плагин не отображает изображение после захвата MVVM - PullRequest
0 голосов
/ 09 июля 2020

Я использую Media Plugin, и все работало нормально, пока я не решил переместить свой logi c в ViewModel.

Это мой Xaml

<Frame BackgroundColor="LightGray" HasShadow="True">
                                <Image
                                    x:Name="Photo"
                                    Grid.Row="2"
                                    HeightRequest="100"
                                    Source="{Binding postViewModel.SelectedPhoto}"
                                    VerticalOptions="Start"/>

                            </Frame>

Моя привязка к MasterViewModel

MasterPostsViewModel ViewModel;

protected override void OnAppearing()
        {
            base.OnAppearing();
        
            BindingContext = ViewModel = new MasterPostsViewModel(Navigation);

        }

Мой Мастер

class MasterPostsViewModel : BaseViewModel
    {
        public PostViewModel postViewModel { get; set; }
        public CategoriesViewModel categoriesViewModel { get; set; }

        public MasterPostsViewModel(INavigation navigation)
        {
            postViewModel = new PostViewModel();

            categoriesViewModel = new CategoriesViewModel();

            postViewModel = new PostViewModel(navigation);
        }

    }

Фотосъемка в модели просмотра

private MediaFile _selectedPhoto;
   public MediaFile SelectedPhoto { get => _selectedPhoto; set => SetValue(ref 
    _selectedPhoto, value); }
     private async Task TakePicture()
            {
                await Permission();
                var imageSource = await DependencyService.Get<IMessage>().ShowActionSheet(AppResources.AlertPhoto, AppResources.AlertNewPhoto, AppResources.AlertGallery);
                if (imageSource == AppResources.AlertNewPhoto)
                {
                    var imageFileName = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions()
                    {
                        Name = $"{DateTime.UtcNow}.jpg",
                        DefaultCamera = Plugin.Media.Abstractions.CameraDevice.Rear,
                        PhotoSize = PhotoSize.Medium,
                        SaveToAlbum = true
                    });
                    if (imageFileName == null) return;
                    else
                    {
                        SelectedPhoto = imageFileName;
    
                    }
                }
    }

Я вижу адрес картинки, однако изображение не отображается на моем xaml. Я пытался следовать этому Bind Plugin.Media fromViewModel

Но все равно не сработало. Пожалуйста, подскажите, что я делаю не так

1 Ответ

0 голосов
/ 10 июля 2020

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

Код в xaml:

<StackLayout>
    <!-- Place new controls here -->
    <Label Text="{Binding postViewModel.SelectedPhoto}"               
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />

    <Button Text="click me" Command ="{Binding postViewModel.NewCommand}"/>
</StackLayout>

Код позади:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    MasterPostsViewModel ViewModel;

    protected override void OnAppearing()
    {
        base.OnAppearing();

        BindingContext = ViewModel = new MasterPostsViewModel(Navigation);

    }
}

class MasterPostsViewModel 
{
    public PostViewModel postViewModel { get; set; }

    public MasterPostsViewModel(INavigation navigation)
    {
        postViewModel = new PostViewModel();
    }

}

class PostViewModel : INotifyPropertyChanged
{
    string _selectedPhoto;

    public ICommand NewCommand { private set; get; }

    public event PropertyChangedEventHandler PropertyChanged;

    public PostViewModel()
    {
        SelectedPhoto = "default text";
        NewCommand = new Command(TakePicture);
    }

    private void TakePicture()
    {
        SelectedPhoto = "test text After click button";
    }

    public string SelectedPhoto
    {
        set
        {
            if (_selectedPhoto != value)
            {
                _selectedPhoto = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("SelectedPhoto"));
                }
            }
        }
        get
        {
            return _selectedPhoto;
        }
    }
}

Пример проекта содержит было загружено здесь .

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