c# - 将页面加载/加载事件绑定到 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 标记中的混乱。
解决方案
在加载/加载视图时,是否有比使用
Microsoft.Xaml.Behaviors.Uwp.Managed
包更简单、更直接的方法来运行代码?
您可以使用x:bind
to 方法,然后在视图模型中创建重定向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
}
推荐阅读
- python - 具有多个标题排列的 Pandas read_csv
- sql - 无法在 CATCH 块 SQL 中引发/引发异常
- python - 按 abc 顺序查找最长的子字符串
- airflow - 气流 - 未知的蓝色任务状态
- redis - 如果我在 redis 中有两个键,例如 X:Y 和 X:Z,我可以通过在 X 上搜索得到它们吗?
- android - Android Room 更新查询卡在自动生成的代码上
- serialization - Janus Graph 远程图 NoSuchFieldError: V3_0 错误
- c - 使用 strlen() 设置 char 数组长度会返回错误的大小
- php - 使用 mpdf html + php
- java - SpringBootWebXmlServlet 在 Web 应用程序启动时预加载失败:“/”