Передать CommandParameter, используя MVVMLight EventToCommand и событие загрузки страницы?

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 в представлении.

Код ВМ:

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

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

и Команда назначается так:

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

Я почти уверен, что проблема заключается в том, что привязка выполняется позже, чем назначение целевому DP или что-то подобное. Я заинтересован в поиске решения для этого как можно скорее или каким-либо другим способом, которым я мог бы получить строку из представления и в модель представления, где строка назначается из переопределения 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