2010-07-15 47 views
3

我想在與DataTemplate關聯的上下文菜單中使用CommandParameter屬性。 commandParameter應該包含對觸發數據模板的對象的引用,如下面的代碼示例所示。我嘗試使用「{Binding Path = this}」,但它不起作用,因爲「this」不是屬性。該命令觸發但我無法獲得正確的參數。有沒有人有一個想法如何做到這一點?如何從XAML中的DataTemplate引用匹配對象?

注意:我刪除了Command =「{Binding DeleteSelectedMeetingCommand}」,將其替換爲對視圖定位器的引用,並且該命令正在觸發。

 <DataTemplate DataType="{x:Type Models:MeetingDbEntry}"> 

     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding Path=HostTeam}"/> 
      <TextBlock Grid.Column="1" Text="{Binding Path=GuestTeam}"/> 
      <TextBlock Grid.Column="2" Text="{Binding Path=Result}"/> 
      <Grid.ContextMenu> 
       <ContextMenu Name="MeetingMenu"> 
        <MenuItem Header="Delete" 
           Command="{Binding 
              Source={StaticResource Locator}, 
              Path=Main.DeleteSelectedMeetingCommand}" 
           CommandParameter="{Binding Path=this}"/> 
       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 

感謝,

回答

3

它使用下面的代碼。您只需在CommandParameter屬性中鍵入{Binding}以引用觸發DataTemplate的屬性。

<DataTemplate DataType="{x:Type Models:MeetingDbEntry}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding Path=HostTeam}"/> 
      <TextBlock Grid.Column="1" Text="{Binding Path=GuestTeam}"/> 
      <TextBlock Grid.Column="2" Text="{Binding Path=Result}"/> 
      <Grid.ContextMenu> 
       <ContextMenu Name="MeetingMenu"> 
        <MenuItem Header="Delete" 
           Command="{Binding 
             Source={StaticResource Locator}, 
             Path=Main.DeleteSelectedMeetingCommand}" 
           CommandParameter="{Binding}" 
           /> 

       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 
0

我揭露它刪除對象的DeleteSelectedMeetingCommand並結合上下文菜單項,以它。然後添加一個成員變量,將要刪除的對象保存到命令中,並在對象中用this進行初始化,以刪除保存該命令的對象。

例子:

public class DeletableObject 
{ 
    public ICommand DeleteCommand { get; } 

    public DeleteableObject() 
    { 
     DeleteCommand = new DeleteCommand(this); 
    } 
} 

public class DeleteCommand : ICommand 
{ 
    private DeletableObject _DeletableObject; 

    public DeleteCommand(DeletableObject deletableObject) 
    { 
     _DeletableObject = deletableObject; 
    } 

    // skipped the implementation of ICommand but it deletes _DeletableObject 
} 

希望有所幫助。

+0

感謝您的回答。事實上,我使用了類似的方法,我將選定的項目綁定到一個屬性,並使用了一個不帶參數的命令。該命令然後使用選定的屬性來刪除該對象。但我試圖在MVVM Light toolkit中探索RelayCommand的模板化版本,並且我想通過XAML直接綁定到RelayCommand,而無需爲綁定指定特定代碼(我成功通過click屬性進行綁定)。 – 2010-07-15 11:08:27

相關問題