Правильно ли я использую этот метод чтения только для привязки? - PullRequest
0 голосов
/ 19 мая 2018

Один из используемых мной пакетов NuGet имеет следующие bindable property доступные:

VideoStateType VideoState { get; } // The current state of the VideoView: Empty, Error, Buffering, Playing, Paused, Stopped

Является ли фрагмент кода ниже правильной реализации "получения" VideoStateType?Я нашел темы, касающиеся свойств только для чтения, но ничего не связано с VideoStateTypes.Я думал, что console.WriteLine поможет мне узнать, но он не отображается в моей консоли.

Правильно ли оно реализовано?

private VideoStateType videoState;

public VideoStateType VideoState
{
    get 
    {
        Console.WriteLine("The VideoState is ", videoState);
        return videoState; 
    }
}

Ниже приведен мой полный код, если вам интересно.По сути, у меня есть рабочее свойство isBusy, которое можно переключить false/true, если я захочу.Но я пытаюсь переключать isBusy = true только во время buffering VideoState.

ОБНОВЛЕНИЕ: 5/20: isBusy изменено на IsBusy в "private void Videoplayer_PropertyChanged"

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System;
using System.ComponentModel;
using System.Windows.Input;
using Xamarin.Forms;
using Rox;

namespace PreAppStructure
{
    public class RoxViewModel : INotifyPropertyChanged
    {

        public RoxViewModel()
        {

        }

        // using "isBusy" binding.  
        // isBusy be manually toggled with:  bool isBusy = true/false;

        bool isBusy;

        public event PropertyChangedEventHandler PropertyChanged;

        public bool IsBusy
        {
            get { return isBusy; }
            set
            {
                isBusy = value;
                OnPropertyChanged(nameof(IsBusy));
            }
        }

        // Attempting to get the "Video State" using the Read-Only Property

        private VideoStateType videoState;

        public VideoStateType VideoState
        {
            get
            {
                Console.WriteLine("The VideoState is ", videoState);
                return videoState;
            }
        }

        // Attempting to use the "Video State" in an if/else statement

        private void Videoplayer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (videoState == VideoStateType.Buffering)
            {
                IsBusy = true; // EDIT: isBusy changed to IsBusy 
            }

            else
            {
                IsBusy = false; // EDIT: isBusy changed to IsBusy
            }
        }

        //Property Changes

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

XAML, в котором находится привязка

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:PreAppStructure"
             xmlns:roxv="clr-namespace:Rox;assembly=Rox.Xamarin.Video.Portable"
             x:Class="PreAppStructure.Page3"
             Title="Welcome to page 3!">
    <Grid>
        <roxv:VideoView x:Name="VideoView" 
                        AutoPlay="True" 
                        LoopPlay="True"  
                        ShowController="True" 
                        Source="http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4" 
                        PropertyChangedCommand="{Binding PropertyChangedCommand}" />

        <StackLayout BackgroundColor="Black" 
                     HorizontalOptions="Center" 
                     VerticalOptions="Center" 
                     IsVisible="{Binding IsBusy}">

            <ActivityIndicator Color="White"
                x:Name="loader"
                IsRunning="{Binding IsBusy}" 
                VerticalOptions="Center" 
                HorizontalOptions="Center"
               />

            <Label x:Name ="loadingtext" 
                   Text="Loading...Please wait!" 
                   HorizontalOptions="Center" 
                   TextColor="White" 
                   IsVisible="{Binding IsBusy}"/>

        </StackLayout>
    </Grid>
</ContentPage>

1 Ответ

0 голосов
/ 19 мая 2018

Если ваш XAML не устанавливает значение, то есть BindingMode = OneWay или в этом случае BindMode = OneTime, тогда вы просто привязываетесь к нему.

Однако ваш IsBusy не запускается должным образом, потому что вы устанавливаете поле поддержки, а уведомление никогда не отправляется.

В обработчике VideoPlayer_PropertyChanged измените isBusy = false ...or true на IsBusy = false ...or true

Я бы также не назвал это связываемым свойством ... Это просто свойство, и вы можете связать его с любыми общими или внутренними свойствами (внутренними, если они совпадают с сборкой).Способ сделать свойство привязываемым в том смысле, в каком вы ссылаетесь, состоит в том, чтобы настроить его с помощью уведомлений, как вы это сделали с IsBusy, или если вы используете DependencyObject, то используйте DependencyProperty, или если это набор, использующий INotifyCollectionChanged большинствопопулярно в форме ObservableCollection<T>.

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