SL4: передача элемента в представлении в качестве параметра команде в ViewModel

#silverlight-4.0 #mvvm-light #relaycommand

#silverlight-4.0 #mvvm-light #relaycommand

Вопрос:

У нас есть пользовательский элемент управления с контекстным меню в одном из его дочерних элементов управления.
Команда привязана к RelayCommand в ViewModel.
Однако команда должна воздействовать на другой дочерний элемент управления в представлении.
Каков наилучший способ сделать это? Я пытался передать желаемый дочерний элемент управления в качестве параметра, но я думаю, что синтаксис неверен:

                         <Controls:ContextMenu >
                        <Controls:MenuItem Header="Center" >
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Click" >
                                    <GalaSoft_MvvmLight_Command:EventToCommand 
                                        Command="{Binding RecenterCommand}"
                                        CommandParameter="{Binding ElementName=scrollViewer}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Controls:MenuItem>
                    </Controls:ContextMenu>
  

Команда:

 RecenterCommand = new RelayCommand<ScrollViewer>(Recenter);  
private void Recenter(ScrollViewer obj)  
{   
}    
  

Когда я использую контекстное меню, вызывается Recenter(), но параметр obj равен нулю.
Каков правильный синтаксис для атрибута ElementName в привязке CommandParameter?

ОБНОВЛЕНИЕ: я попытался изменить CommandParameter на:

 CommandParameter="{Binding ElementName=LayoutRoot, Path=scrollViewer}"
  

…но все равно не работает.

Спасибо за любую информацию….

Комментарии:

1. действительно ли ваш элемент x: Name =ScrollViewer?

2. Да, это: <ScrollViewer x:Name=»ScrollViewer»

Ответ №1:

Я думаю, что вам нужно добавить PassEventArgsToCommand=»True», чтобы код был таким:

 <GalaSoft_MvvmLight_Command:EventToCommand  PassEventArgsToCommand="True":
                                    Command="{Binding RecenterCommand}" 
                                    CommandParameter="{Binding ElementName=scrollViewer}" />
  

и если вы хотите преобразовать данные в codebehind, поместите (это код из одной из моих программ, используемых для элемента контекстного меню)

Выбранный employer e = ((MenuItem)e).DataContext как работодатель

Я надеюсь, что это решит вашу проблему, потому что вы дали мне подсказку о том, как решить одну из моих проблем..

Комментарии:

1. Спасибо за ответ. Когда я использую RelayCommand<RoutedEventArgs>, RoutedEventArgs. Исходный источник равен нулю. Когда я пытаюсь использовать RelayCommand<ScrollViewer>, я не могу использовать PassEventArgsToCommand — получаю исключение, в котором говорится, что RoutedEventArgs не может быть приведен к ScrollViewer.

2. Если я использую RelayCommand<ScrollViewer> и CommandParameter, параметр ScrollViewer, переданный команде, равен нулю. Это заставляет меня задуматься, не является ли синтаксис в CommandParameter неправильным.