2011-02-26 62 views
1

我在列表視圖控件上有一個按鈕。我已將此控件綁定到ViewModel類的基類中的一個命令。如果我在列表視圖之外放置一個按鈕,它可以使用相同的命令正常工作。但是,當我把它放在列表視圖上時,命令不會被解僱。ListView上的按鈕 - 使用MVVM

你能想到一個原因嗎?

下面是摘錄:

<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

這是因爲按鈕在ListViewItem,所以它繼承了包含該項目的DataContext的。這裏是你如何能綁定到ListView本身的DataContext:

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

補充說明:根據命令做什麼,它可能是更好地把它的視圖模型的項目

+0

關於物品的視圖模型?這些項目代表* data *,而不是邏輯。把命令放在那裏是錯誤的恕我直言。 – 2011-02-26 21:22:17

+0

謝謝你們。我是這麼想的。我本可以實現ViewModellocator方法,但是這個方法變得更快。 – user635097 2011-02-28 19:13:59

0

當你把按鈕列表視圖裏面得到一個新的DataContext - 它會在列表中的當前項目的DataContext的,併爲此失去原來的DataContext。

這個最好的解決辦法是使用ViewModelLocator

0

你也可以用少一點的代碼來做到這一點..

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