Подайте CommandParameter с помощта на MVVMLight EventToCommand и събитието Page Load?

EventToCommand не успява да предаде параметър на командата при събитие за зареждане

Когато е прикачен към събитието Load на страницата или потребителския контрол, EventToCommand успешно извиква манипулатора в ViewModel, но не предава CommandParameter. Въпреки това, същият XAML е прикачен към друго събитие, например щракване върху бутон, манипулаторът на командите получава свързаните с данни данни като свой параметър. Xaml:

<i:EventTrigger EventName="Loaded" SourceObject="{Binding ElementName=Control}"> <Command:EventToCommand x:Name="etcLoad" Command="{Binding LoadCommand}" CommandParameter="{Binding Target, ElementName=Control}" /> </i:EventTrigger>

Целта е низ DP на изгледа.

VM код:

    internal void Load(string p_Param)
    {
        this.Initialise();
    }

    public RelayCommand<string> LoadCommand { get; private set; }

и командата е зададена така:

    this.LoadCommand = new RelayCommand<string>(this.Load);

Почти съм сигурен, че проблемът е в това, че свързването е направено по-късно от присвояването на Target DP или нещо подобно. Интересувам се от намирането на решение за това възможно най-скоро или по някакъв друг начин, по който мога да извадя низ от изгледа и във ViewModel, където низът е присвоен от отмяната на OnNavigateTo. Целта е да се осигури избор на раздел въз основа на свойство на заявка, предоставено чрез URI, т.е. „/Views/DisplayTabDetails?Tab=Tab1“ или подобно.


person Intelligence4    schedule 21.10.2011    source източник


Отговори (1)


Използвайте свойството PassEventArgsToCommand, за да посочите, че аргументите на събитието трябва да бъдат предадени на командата. Следователно във вашия XAML трябва да използвате:

<i:EventTrigger EventName="Loaded" 
                SourceObject="{Binding ElementName=Control}"> 
    <Command:EventToCommand x:Name="etcLoad" 
                            Command="{Binding LoadCommand}" 
                            PassEventArgsToCommand="True" /> 
</i:EventTrigger>

Редактиране

Някои събития се задействат, преди потребителското взаимодействие да може да се осъществи. Подходът, който обикновено се използва в този случай, е да извикате вашата команда от кода отзад. В тази публикация можете да видите концепцията, очевидно ще трябва да я промените на заредено събитие и вашите нужди, концепцията и причината за него обаче са същите.

person AxelEckenberger    schedule 21.10.2011
comment
Да, това е възможно, но в случай на събитие Load с помощта на public RelayCommand<RoutedEventArgs> LoadCommand{get; private set;} води до нулева стойност за параметъра в манипулатора на командата. Изглежда, че има нещо с темпоралния аспект, което идва на бял свят тук - параметърът просто не е зададен. - person Intelligence4; 21.10.2011
comment
Добавена е връзка към решение на проблема, както и няколко реда тук. щях да публикувам примера директно, но писането на код на мобилно устройство е просто болка в задната част ... съжалявам, но се надявам, че примерът все още помага! - person AxelEckenberger; 22.10.2011