将页面加载/加载事件绑定到ICommand

时间:2019-04-07 20:22:38

标签: c# xaml uwp uwp-xaml

首先让我说,我已经知道了这个讨论Microsoft.Xaml.Behaviors.Uwp.Managed package.

的问题的所有答案。

但是我真的需要知道这是在加载视图时从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));
        }
    }
  }
}

我的直接假设是,如果我想在加载或加载Page(视图)时运行代码,它将使用相同的过程。但这是行不通的。在这种情况下,VS会抱怨我要绑定的ICommand不是方法。让我清楚我在说什么:

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

与使用Microsoft.Xaml.Behaviors.Uwp.Managed软件包相比,在加载/加载View时,是否有一种更简单,更直接的方式来运行代码?我只是真的不喜欢使用该软件包将添加到我的XAML标记中。

2 个答案:

答案 0 :(得分:1)

  

与使用Microsoft.Xaml.Behaviors.Uwp.Managed包相比,在View加载/正在加载时,有没有更简单,更直接的方式来运行代码?

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

答案 1 :(得分:0)

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解决方案相比,此解决方案仅通过编程方式从完全相同的视图中执行完全相同的视图模型命令。