Hoe de CommandParameter te gebruiken met een RelayCommand?

Ik leer nog steeds het verhaal van MVVM en wpf en op dit moment probeer ik een Mediaplayer te maken met MVVM. Na intensief googelen heb ik besloten dat het gebruik van CommanParameter de beste manier is om code achter te laten. Ik denk dat de code en XAML er goed uitziet, maar er is geen magie - AKA er gebeurt niets.

Bestaat er een vriendelijke ziel die mijn code eens wil bekijken en me wat advies wil geven? Zoals altijd, waardeer ik echt uw antwoorden. Negeer alstublieft mijn meervouden in RelayCommands, het was al laat :)

XAML




<button 
    Command="{Binding PlayMediaCommand}" 
    CommandParameter="{Binding ElementName=MediaElement, Mode=OneWay}"><<</button>

C#

class MediaPlayerViewModel: INotifyPropertyChanged
{
    private MediaElement MyMediaElement;

    private Uri _videoToPlay;

    public Uri VideoToPlay
    {
        get { return _videoToPlay; }
        set
        {
            _videoToPlay = value;
            OnPropertyChanged("VideoToPlay");
        }
    }

    void SetMedia()
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.InitialDirectory = "c:\\";
        dlg.Filter = "Media files (*.wmv)|*.wmv|All Files (*.*)|*.*";
        dlg.RestoreDirectory = true;

        if (dlg.ShowDialog() == true)
        {
            VideoToPlay = new Uri(dlg.FileName);

        }
    }

    RelayCommands _openFileDialogCommand;
    public ICommand OpenFileDialogCommand
    {
        get
        {
            if (_openFileDialogCommand == null)
            {
                _openFileDialogCommand = new RelayCommands(p => SetMedia(),
                    p => true);
            }
            return _openFileDialogCommand;
        }
    }

    RelayCommands _playMediaCommand;
    public ICommand PlayMediaCommand
    {
        get
        {
            if (_playMediaCommand == null)
            {
                _playMediaCommand = new RelayCommands(p => PlayMedia(p),
                    p => true);
            }
            return _playMediaCommand;
        }
    }

    void PlayMedia(object param)
    {
        var paramMediaElement = (MediaElement)param;
        MyMediaElement = paramMediaElement;
        MyMediaElement.Source = VideoToPlay;
        MyMediaElement.Play();
    }



    protected void OnPropertyChanged(string propertyname)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyname));
    }

    public event PropertyChangedEventHandler PropertyChanged;




class RelayCommands: ICommand
{
    private readonly Predicate _canExecute;
    private readonly Action _execute;

    public event EventHandler CanExecuteChanged;

    public RelayCommands(Action execute)
        : this(execute, null)
    {}

    public RelayCommands(Action execute,
                   Predicate canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {

        if (_canExecute == null)
        {
            return true;
        }

        return _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }

}




8
Ik neem aan dat je de gegevenscontext op de weergave hebt ingesteld?
toegevoegd de auteur kenny, de bron
ja dat deed ik :) het is ingesteld op het raam
toegevoegd de auteur Iris Classon, de bron

1 antwoord

Uw voorbeeldcode werkt goed zodra de eigenschap VideoToPlay is ingesteld. Weet je zeker dat je dit inschakelt? Uw XAML-fragment bevatte geen gebruik van de OpenFileDialogCommand waarmee deze eigenschap wordt ingesteld:

<button Content="Select File" Command="{Binding OpenFileDialogCommand}" />
1
toegevoegd
Blij dat je je probleem hebt opgelost. Als het bovenstaande antwoord je geholpen heeft, accepteer het dan alsjeblieft :)
toegevoegd de auteur F Ruffell, de bron
SLAP :) SLAP :)
toegevoegd de auteur SvenG, de bron
Ik gebruikte die opdracht in het Top-menu, dat ik ben vergeten hier in code te tonen :) maar het is er. Ik kan de afspeelknop nog steeds niet krijgen om de video af te spelen.
toegevoegd de auteur Iris Classon, de bron
Oh jee, ik realiseerde me net wat ik verkeerd deed ... Het commando staat OP DE VERKEERDE KNOP. het staat op de knop <<. Stuur me alsjeblieft een virtuele klap.
toegevoegd de auteur Iris Classon, de bron
Ik verdien dat: '(
toegevoegd de auteur Iris Classon, de bron