使用xaml绑定和viewmodel使用参数执行命令

时间:2011-05-03 08:57:00

标签: c# xaml binding itemscontrol commandparameter

目前我在xaml:

<ItemsControl ItemsSource="{Binding Facilities, Mode=OneWay}">
 <ItemsControl.ItemTemplate>
  <DataTemplate>
   <Border Style="{StaticResource BorderStyleHeader}">
    <Grid>
     <Grid.RowDefinitions>
      <RowDefinition Height="33" />
      <RowDefinition Height="33" />
     </Grid.RowDefinitions>
     <Grid.ColumnDefinitions>
      <ColumnDefinition Width="150" />
      <ColumnDefinition Width="*" />
     </Grid.ColumnDefinitions>
     <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="1" FontWeight="Bold" />
     <TextBlock Text="{Binding Description}" Grid.Row="1" Grid.Column="1" />
     <Button Content="Reserveer Nu" Style="{StaticResource ButtonStyle}" 
             Margin="5" Grid.Row="1" Grid.Column="0" 
             Command="{Binding Reservation.ItemClicked}" 
             CommandParameter="{Binding FacilityId}"/>
    </Grid>
   </Border>
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

现在第一件事是我希望按钮在我的viewmodel中引发事件

public RelayCommand ItemClicked
{
    get
    {
        return new RelayCommand(() =>
        {
            MessageBox.Show("Something is clicked");
        });
    }
}

但它拒绝......
其次我希望能够用参数引发事件(注意命令参数),但我从未使用它,因此我不明白如何使用它。

所以我的问题:

  1. 为什么我的relaycommand没有被执行?

  2. 如何使用命令参数?

1 个答案:

答案 0 :(得分:4)

  

为什么我的继电器命令没有被执行?      如何使用命令参数?

如果您使用Josh Smith's article中的RelayCommand课程,则两个问题都有相同的答案......构造函数需要Action<object>,而不是Action。所以你的代码应该是:

    return new RelayCommand((param) =>
    {
        MessageBox.Show("Something is clicked - Parameter value = " + param);
    });

编辑:好的,所以你正在使用MVVM Light的RelayCommand ......这个类有两个版本,一个是通用的,一个不是。非泛型版本不接受参数,因此您需要通用版本。您的命令应如下所示:

public RelayCommand<int> ItemClicked
{
    get
    {
        return new RelayCommand<int>((i) =>
        {
            MessageBox.Show("Something is clicked - Parameter value is " + i);
        });
    }
}

(假设参数类型为int

至于为什么你当前的代码不起作用,如果没有其他信息我就无法回答......