Связать загруженную страницу / событие загрузки с ICommand - PullRequest
0 голосов
/ 07 апреля 2019

Позвольте мне начать с того, что мне уже известны все ответы на этот вопрос, в которых обсуждается пакет Microsoft.Xaml.Behaviors.Uwp.Managed.

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

В этом виде (без разметки шаблонов) это выглядит так:

<Page xmlns:vm="using:FIFA.ViewModels">
    <Page.DataContext>
        <vm:WeekInputViewModel/>
    </Page.DataContext>
    <Button Command="{Binding Save, Mode=OneWay}"/>
</Page>

ViewModel будет выглядеть так:

namespace FIFA.ViewModels {
  class WeekInputViewModel : MainViewModelBase
  {
    private ICommand save_;
    public ICommand Save{
        get { return save_ = save_ ?? new DelegateCommand(SaveExec); }
    }
    private void SaveExec() {
        // To be ran
    }
}

И это MainViewModelBase:

namespace FIFA.ViewModels
{
  public abstract class MainViewModelBase : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName) {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
  }
}

Мое непосредственное предположение состояло в том, что если бы я хотел запустить код, когда страница (представление) была загружена или загружалась, он бы использовал это жеточный процесс.Но это не работает.В этом случае VS пожаловался бы, что ICommand, к которому я пытаюсь привязаться, не является методом.И позвольте мне прояснить, о чем я говорю:

<Page Loaded="{Binding //SOLUTION_HERE//}">

Существует ли более простой и простой способ запуска кода при загрузке / загрузке представления, чем использование Microsoft.Xaml.Behaviors.Uwp.Managed package? Мне просто не нравится беспорядок, который использование этого пакета добавит в мою разметку XAML.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Есть ли более простой и простой способ запуска кода при загрузке / загрузке View, чем при использовании пакета Microsoft.Xaml.Behaviors.Uwp.Managed?

Вы можете использовать x:bind для подхода,затем создайте метод перенаправления PageLoad() в модели представления и присвойте экземпляру модели страницы x:Name, как показано ниже.

<Page x:Class="Hamburger5.Views.MainPage"
      .......

      Loaded="{x:Bind  ViewModel.PageLoad}"

      xmlns:vm="using:Hamburger5.ViewModels" mc:Ignorable="d">

    <Page.DataContext>
        <vm:MainPageViewModel x:Name="ViewModel" />
    </Page.DataContext>

ViewModel

public void PageLoad() => OnLoad();
private void OnLoad()
{
// do some thing
}
0 голосов
/ 09 апреля 2019

Loaded - это событие, которое вы можете обработать в коде вашего Page и просто выполнить команду модели представления из обработчика события:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        WeekInputViewModel viewModel = DataContext as WeekInputViewModel;
        if (viewModel != null)
            viewModel.SaveCommand.Execute(null);
    }
}

Вам не нужно включать какую-либо разметку XAML, если вы этого не хотите.

По сравнению с решением XAML, включенным пакетом Microsoft.Xaml.Behaviors.Uwp.Managed, это решение просто выполняет точно такую ​​же команду модели представления из того же самого представления - программно.

...