#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 неправильным.