Используйте триггеры событий Blend SDK, чтобы вызвать нажатие кнопки с соответствующим элементом списка MVVM - PullRequest
0 голосов
/ 14 сентября 2011

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

Мой код ...

Public void MyCommand(object obj)
{
    // the tag of this has the search type
    ListViewItem item = obj as ListViewItem;

    // do my dreary domain work...
}

мой xaml это ...

<ListView ItemsSource="{Binding Path=SystemSetupItems}" 
    SelectedItem="{Binding Selected, Mode=TwoWay}" 
    MinHeight="120" >
    <ListView.View>
    <GridView>
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
        <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
        <GridViewColumn>
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Button  >
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseClick">
                                <i:InvokeCommandAction CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem, AncestorLevel=1}}" Command="{Binding MyCommand}"/>
                            </i:EventTrigger>
                         </i:Interaction.Triggers>
                     </Button>
                 </DataTemplate>
             </GridViewColumn.CellTemplate>
        </GridViewColumn>                        
    </GridView>
    </ListView.View>
</ListView>

но это не работает вообще, или я могу сделать это в своем определении кнопки xaml

<GridViewColumn.CellTemplate>
    <DataTemplate>
        <Button Command="{Binding OpenWorkSpaceCommand}" CommandParameter="{Binding Path=Name}" Content="Edit..." DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"  >                                 
        </Button>
    </DataTemplate>
</GridViewColumn.CellTemplate>

но для этого требовалось предварительно выбрать элемент списка, а это не то поведение, которое мне нужно.

1 Ответ

0 голосов
/ 14 сентября 2011

Для моей DataGrid у меня есть кнопка для каждого элемента, используя шаблон ячейки. Каждый предмет является объектом типа Meal. В моем файле Meal.cs у меня есть определение события, например:

public Meal()
{
    RemoveMealCommand = new RelayCommand(() => RemoveMealCommandExecute());
}

public RelayCommand RemoveMealCommand
{
    get;
    set;
}

public delegate void RemoveMealEventHandler(object sender, EventArgs e);
public event RemoveMealEventHandler RemoveMealEvent;

private void RemoveMealCommandExecute()
{
    RemoveMealEvent(this, null);
}

В моей viewmodel для каждой еды в моем списке я могу просто добавить обработчик для этого события. А для своей кнопки xaml я просто установил команду на RelayCommand Meal.

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Command="{Binding Path=RemoveMealCommand}">
                <Image Width="13" Height="13" Source="/Images/delete-icon.png"/>
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Теперь, когда вы нажимаете кнопку, еда запускает событие, а модель просмотра отвечает за его обработку.

...