Позвольте мне начать с того, что я уже знаю обо всех ответах на этот вопрос, в которых обсуждается Пакет 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>
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.
Is there a simpler, more straightforward way to run code when a View loads/is loading than using the
Microsoft.Xaml.Behaviors.Uwp.Managed
package?
Вы можете использовать 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
}
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, если вы этого не хотите.
По сравнению с решением XAML, включенным в пакет Microsoft.Xaml.Behaviors.Uwp.Managed
, это решение просто выполняет ту же самую команду модели представления из того же представления — программно.