Кнопка на ListView - используя MVVM - PullRequest
1 голос
/ 26 февраля 2011

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

вы можете придумать причину ????

Ниже приведен фрагмент:

<ListView Grid.Row="2" AlternationCount="2" ItemsSource="{Binding Path=AObject}" Margin="20" MaxHeight="200">
            <ListView.DataContext>
                <local:MyViewModel/>
            </ListView.DataContext>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Run ID" DisplayMemberBinding="{Binding Path=RID}" />
                    <GridViewColumn Header="Job ID" DisplayMemberBinding="{Binding Path=JID}" />
                    <GridViewColumn Header="Run Description">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ContentPresenter Content="{Binding Path=OpenScCommand}" HorizontalAlignment="Right"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Edit">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button  Command="{Binding ShowItemCommand}" CommandParameter="{Binding Path=RID}" Content="_Edit email run" IsDefault="False"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

Ответы [ 3 ]

3 голосов
/ 27 февраля 2011

Это потому, что кнопка находится в ListViewItem, поэтому она наследует DataContext элемента, который ее содержит. Вот как вы можете привязать к DataContext самого ListView:

<Button  Command="{Binding ShowItemCommand}" DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" ...

В качестве примечания: в зависимости от того, что делает команда, может быть лучше поместить ее в ViewModel элементов

0 голосов
/ 19 июля 2012

Вы также можете сделать это с немного меньшим количеством кода ..

<Button Command="{Binding ShowItemCommand}">
    <Button.DataContext>
        <local:MyViewModel/>
    </Button.DataContext>
 </Button>
0 голосов
/ 26 февраля 2011

Когда вы помещаете кнопку в представление списка, он получает новый DataContext - он получает DataContext текущего элемента в списке и, следовательно, теряет исходный DataContext.

Лучшее решение для этого - использовать ViewModelLocator

...