开发者

Button on a ListView - using MVVM

I have a button on a listview control. I have bound this control to one of the command on the base class of the ViewModel class. If I place a button outside of the listview it works fine with the same command. But the command does not get fired when I place it on the listview.

can y开发者_高级运维ou think of a reason????

Below is the snippet:

<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>


That's because the button is in the ListViewItem, so it inherits the DataContext of the item that contains it. Here's how you can bind to the DataContext of the ListView itself:

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

As a side note: depending on what the command does, it might be better to put it in the ViewModel of the items


When you put the button inside the listview it gets a new DataContext - it gets the DataContext of the current item in the list, and therefor it loses the original DataContext.

The best solution to this is using ViewModelLocator


You can also do this with a little less code..

<Button Command="{Binding ShowItemCommand}">
    <Button.DataContext>
        <local:MyViewModel/>
    </Button.DataContext>
 </Button>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜