首页 > 解决方案 > 将页面加载/加载事件绑定到 ICommand

问题描述

让我首先说我已经知道对这个问题的所有回复,讨论了Microsoft.Xaml.Behaviors.Uwp.Managed 包。

但我真的需要知道这是否是在 View 加载时从 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//}">

是否有比使用 Microsoft.Xaml.Behaviors.Uwp.Managed 包更简单、更直接的方式来在视图加载/加载时运行代码?我真的不喜欢使用该包会添加到我的 XAML 标记中的混乱。

标签: c#xamluwpuwp-xaml

解决方案


在加载/加载视图时,是否有比使用Microsoft.Xaml.Behaviors.Uwp.Managed包更简单、更直接的方法来运行代码?

您可以使用x:bindto 方法,然后在视图模型中创建重定向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>

视图模型

public void PageLoad() => OnLoad();
private void OnLoad()
{
// do some thing
}

推荐阅读