将 Page Loaded/Loading 事件绑定到 ICommand

Bind Page Loaded/Loading event to an ICommand

首先让我说我已经知道讨论

这个问题的所有回复

但我真的需要知道这是否是在视图加载时从 ViewModel 执行代码的唯一方法。我的意思是,将按钮命令绑定到 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//}">

加载视图 loads/is 时,是否有比使用 Microsoft.Xaml.Behaviors.Uwp.Managed 包更简单、更直接的 运行 编码方法? 我只是真的不喜欢使用那个包会添加到我的 XAML 标记中的混乱。

Is there a simpler, more straightforward way to run code when a View loads/is loading than using the Microsoft.Xaml.Behaviors.Uwp.Managed package?

您可以使用 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
}

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 标记。

与由 Microsoft.Xaml.Behaviors.Uwp.Managed 包启用的 XAML 解决方案相比,此解决方案仅以编程方式从完全相同的视图执行完全相同的视图模型命令。