C# 将页面加载/加载事件绑定到ICommand
首先,我要说,我已经意识到所有对这个问题的回答,这些回答讨论了 但我真的需要知道,当视图加载时,这是否是从ViewModel执行代码的唯一方法。我的意思是,将按钮命令绑定到ICommand对象非常简单 在视图中可以忽略样板文件标记:C# 将页面加载/加载事件绑定到ICommand,c#,xaml,uwp,uwp-xaml,C#,Xaml,Uwp,Uwp Xaml,首先,我要说,我已经意识到所有对这个问题的回答,这些回答讨论了 但我真的需要知道,当视图加载时,这是否是从ViewModel执行代码的唯一方法。我的意思是,将按钮命令绑定到ICommand对象非常简单 在视图中可以忽略样板文件标记: <Page xmlns:vm="using:FIFA.ViewModels"> <Page.DataContext> <vm:WeekInputViewModel/> </Page.DataC
<Page xmlns:vm="using:FIFA.ViewModels">
<Page.DataContext>
<vm:WeekInputViewModel/>
</Page.DataContext>
<Button Command="{Binding Save, Mode=OneWay}"/>
</Page>
这是主视图模型库:
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标记带来混乱
当视图加载/正在加载时,是否有比使用Microsoft.Xaml.Behaviors.Uwp.Managed包更简单、更直接的方法来运行代码
您可以使用x:bind方法,然后在视图模型中创建redirectpageload方法,并给页面模型实例一个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>
Loaded是一个事件,您可以在页面的代码隐藏中处理该事件,只需从事件处理程序执行视图模型的命令:
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解决方案相比,此解决方案只需从同一视图以编程方式执行完全相同的视图模型命令
public void PageLoad() => OnLoad();
private void OnLoad()
{
// do some thing
}
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);
}
}