2013-02-02 89 views
1

我目前正在使用ICommand進行測試,我想知道爲什麼ICommand不會使用ListBox.ItemTemplate中的按鈕觸發。但是,當在模板外部使用時,它可以工作。ICommand不會觸發ItemTemplate中的按鈕

這裏的窗口XAML

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.Window2" 
     Title="Window2" Height="300" Width="300"> 
    <Window.DataContext> 
     <local:W2VM/> 
    </Window.DataContext> 

    <Grid> 
     <ListBox x:Name="listHistory" BorderThickness="0" Margin="0" Padding="0" HorizontalContentAlignment="Stretch" ItemsSource="{Binding History}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <TextBlock Text="{Binding ''}" /> 
         <Button 
          Grid.Column="1" 
          HorizontalAlignment="Right" 
          x:Uid="btnDeleteHistoryItem" 
          x:Name="btnDeleteHistoryItem" 
          Content="r" 
          FontFamily="Marlett" 
          Visibility="Hidden" Command="{Binding MeClick}" 

          /> 
        </Grid> 

        <DataTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Visibility" TargetName="btnDeleteHistoryItem" Value="Visible" /> 
         </Trigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

     <Button Content=" exit " VerticalAlignment="Bottom" Command="{Binding ExitCommand}" /> 
    </Grid> 
</Window> 

這裏的完整視圖模型代碼

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window2.xaml 
    /// </summary> 
    public partial class Window2 : Window 
    { 
     public Window2() 
     { 
      InitializeComponent(); 
     } 
    } 

    public class W2VM : ViewModelBase 
    { 
     public List<string> _History = new List<string>(); 
     public List<string> History 
     { 
      get { return this._History; } 
     } 

     public ICommand MeClick 
     { 
      get; 
      internal set; 
     } 

     public ICommand ExitCommand 
     { 
      get; 
      internal set; 
     } 

     public W2VM() 
     { 
      this.History.AddRange(new string[] { 
       "jayson", "hello", "world" 
      }); 

      this.MeClick = new RelayCommand(Test); 
      this.ExitCommand = new RelayCommand(Exit); 
     } 

     void Exit() 
     { 
      Application.Current.Shutdown(); 
     } 

     void Test() 
     { 
      Debug.WriteLine("hello world"); 

      MessageBox.Show("do something incredible"); 
     } 
    } 
} 

測試()不火


確定我得到它的工作..

<Window.Resources> 
    <me:W2VM x:Key="local" /> 
</Window.Resources> 

代替

<Window.DataContext> 
    <local:W2VM/> 
</Window.DataContext> 

和我的窗口電網

<Grid DataContext="{StaticResource local}"> 
    <ListBox x:Name="listHistory" BorderThickness="0" Margin="0" Padding="0" HorizontalContentAlignment="Stretch" ItemsSource="{Binding History}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <TextBlock Text="{Binding ''}" /> 
        <Button 
         Grid.Column="1" 
         HorizontalAlignment="Right" 
         x:Uid="btnDeleteHistoryItem" 
         x:Name="btnDeleteHistoryItem" 
         Content="r" 
         FontFamily="Marlett" 
         Visibility="Hidden" Command="{Binding MeClick, Source={StaticResource local}}" /> 
       </Grid> 

       <DataTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Visibility" TargetName="btnDeleteHistoryItem" Value="Visible" /> 
        </Trigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <Button Content=" exit " VerticalAlignment="Bottom" Command="{Binding ExitCommand}" /> 
</Grid> 

現在這將提出另一項質詢。

當btnDeleteHistoryItem命令剛剛路由時,我怎麼知道哪個ListViewItem被點擊?

+0

我的未回答的問題的第三個 –

回答

0

您是否使用mvvm-light的繼電器命令? 我用命令的參數來傳遞信息的命令方法:

<Button 
         Grid.Column="1" 
         HorizontalAlignment="Right" 
         x:Uid="btnDeleteHistoryItem" 
         x:Name="btnDeleteHistoryItem" 
         Content="r" 
         FontFamily="Marlett" 
         Visibility="Hidden" Command="{Binding MeClick, Source=StaticResource local}}" 
         CommandParameter="YourUniqueIdentifyingVariable" /> 

,然後在您的視圖模型:

public RelayCommand<string> MeClick{ 
    get { return _MyClick; } 
    private set { _MyClick = value; } 
} 

public New() 
{ 

    MeClick = new RelayCommand<string>(MySub, MySubIsEnabled); 
} 

private void MySub(string sParam) 
{ 
    //do stuff here, YourUniqueIdentifyingVariable is sParam 
} 

private bool MySubIsEnabled(string sParam) 
{ 
    return true; 
} 

可以綁定「YourUniqueIdentifyingVariable」的記錄的ID或其他一些價值你可以用你的命令方法處理

代碼未經測試但應該可以工作