Как бы вы узнали, какой элемент ItemsControl отправляет событие в MVVM? - PullRequest
1 голос
/ 10 августа 2011

Допустим, у меня в настоящее время есть ItemsControl, DataTemplate которого представляет собой набор кнопок.Я связываю события нажатия этих кнопок, но как мне узнать, какая кнопка была нажата?Я не должен использовать ItemsControl?

Я пытаюсь не иметь никакого кода, но быть прагматичным может быть необходимо.

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Margin="10">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding ItemsControlButtonClicked, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Ответы [ 5 ]

4 голосов
/ 10 августа 2011

Если вы хотите узнать, на что нажали Item, передайте {Binding } как CommandParameter, и он передаст выбранный объект вашей команде

Если вы хотите узнать, что Buttonщелкнул, я сделал бы это в коде позади, так как ViewModels не нужно ничего знать о пользовательском интерфейсе, и это включает в себя кнопки.

Также, поскольку ваш элемент управления является кнопкой, вы должны использовать Commandсвойство вместо триггера Click.

<Button Command="{Binding ItemsControlButtonClicked}" />
0 голосов
/ 10 августа 2011

Создайте свойства команды в классе модели представления (используя шаблон RelayCommand Джоша Смита - самый простой способ сделать это) и привяжите Command каждой кнопки к соответствующей. Это не только просто и просто в обслуживании, но также дает вам простой способ реализовать поведение включения / выключения, когда вам нужно.

0 голосов
/ 10 августа 2011

Ну, вы можете использовать Sender.DataContext, который является фактическими данными.

0 голосов
/ 10 августа 2011

В моем проекте я также использую MVVM Light, у меня есть выпадающий список с коллекцией элементов, и кнопка, нажатие и действие которой зависят от выбранного элемента, из выпадающего списка, вы должны создать команду Relay с параметром, посмотрите на пример из моегокод

  public RelayCommand<Project> StartTimer { get; private set; }//declare command

   StartTimer = new RelayCommand<Project>(OnStartTimer);

    private void OnStartTimer(Project project)
    {

        if (project != null)
        {

            currentProject = project;

            if (!timer.IsTimerStopped)
            {
                timer.StopTimer();
            }
            else
            {
                Caption = "Stop";
                timer.StartTimer();
            }
        }

в представлении Я связываю раскрывающийся список с коллекцией класса Project, а для параметра команды кнопки связываю выбранный элемент формы в раскрывающемся списке посмотрите код

   <ComboBox Name="projectcomboBox" ItemsSource="{Binding Path=Projects}"    IsSynchronizedWithCurrentItem="True" DisplayMemberPath="FullName"
              SelectedValuePath="Name"  SelectedIndex="0"  >
    </ComboBox>
      <Button Name="timerButton" Content="{Binding Path=Caption}" Command="{Binding Path=StartTimer}" 
                CommandParameter="{Binding ElementName=projectcomboBox, Path=SelectedItem}"  ></Button>

payвнимание на привязку Command и CommandParameter

, также вы можете использовать этот подход не только для выпадающего списка

0 голосов
/ 10 августа 2011

Вы можете отправить параметры вместе с командой, и на основе этих параметров вы можете узнать, какая кнопка была нажата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...