UWP x: команда Bind - PullRequest
       19

UWP x: команда Bind

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

Можно ли так придерживаться команды.

Контекст

<Page.DataContext>
         <local: MainPage />
     </Page.DataContext>

Команда

static public Command Pause (MediaElement element)
         {
             element.Pause ();
             return new Command ();
         }

Сама привязка

<Button VerticalAlignment = "Bottom"
                 Margin = "10,0,0,10" Command = "{x: Bind local: MainPage.Pause (mp)}"
                 HorizontalAlignment = "Left" Height = "30" Width = "100"> Pause </ Button>

начать, но через пару секунд ошибка System.StackOverflowException Почему ошибка переполнения и как ее преодолеть

1 Ответ

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

Когда вы используете {x: bind} для привязки свойства ButtonBase.Command , вы должны привязать команду, которая будет вызываться при нажатии этой кнопки.В вашем коде вы связываете статический метод, который возвращает команду, но этот статический метод принадлежит самому типу, а не конкретному объекту.

Чтобы устранить эту ошибку, вы должны удалить коды, которые устанавливают экземпляр объекта контекста данных страницы в xaml.То есть, чтобы удалить следующий код,

<Page.DataContext>
    <local:MainPage />
</Page.DataContext>

Если вы хотите связать команду для работы с MediaElement, вы должны поместить в нее код операции, вот пример,

MainPage.xaml,

<StackPanel>
    <MediaElement Name="mp" Width="800" Height="400" Source="ms-appx:///Assets/video.mp4"/>

    <Button VerticalAlignment = "Bottom" Margin = "10,0,0,10" Command = "{x:Bind local:MainPage.Pause(mp)}"
             HorizontalAlignment = "Left" Height = "30" Width = "100">Pause</Button>
</StackPanel>

MainPage.xaml.cs и команда,

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    public static Command Pause(MediaElement element)
    {
        //element.Pause();
        return new Command(s => { element.Pause(); },true);
    }
}

public class Command : ICommand
{
    private Action<object> action;
    private bool canExecute;
    public event EventHandler CanExecuteChanged;

    public Command(Action<object> action,bool canExecute)
    {
        this.action = action;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return canExecute;
    }

    public void Execute(object parameter)
    {
        action(parameter);
    }
}
...