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



首先,我要说的是,我已经知道所有关于Microsoft.Xaml.Behaviors.Uwp.Managed 包的对这个问题的回答。

但我真的需要知道这是否是在视图加载时从 ViewModel 执行代码的唯一方法。我的意思是,将按钮命令绑定到 ICommand 对象非常简单。

视图中有以下内容(省略样板标记):

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

视图模型如下所示:

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 标记的混乱。

没有比使用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>

视图模型

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

最新更新