WPF ItemsControl Button命令绑定不起作用

时间:2015-09-12 18:30:42

标签: c# wpf mvvm

我有一个ItemsControl控件,它有一个ObservableCollection作为其ItemsSource。它还有一个位于DataTemplate内部的按钮。按钮的Command属性绑定到ViewModel中的RelayCommand(我正在使用MVVM Light),CommandParameter绑定到ItemsSource中的相应项目。
问题是由于某种原因,命令永远不会触发。另一方面,代码隐藏工作正常。调试鼠标单击事件处理程序时,我可以看到发送方(类型为Button)的CommandParameter填充了正确的数据,而Command为null。

我在这里想念的是什么?

XAML:

<ItemsControl ItemsSource="{Binding Users}"
              Margin="{StaticResource ContentMargin}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Margin="{StaticResource ImageButtonMargin}"
                    Style="{StaticResource ImageButtonStyle}"
                    Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.UserSelectedCommand}"
                    CommandParameter="{Binding}">
                    <!--...-->

视图模型:

private ObservableCollection<User> _users;
private RelayCommand<User> _userSelectedCommand;

public ObservableCollection<User> Users
{
    get { return _users; }
    set
    {
        _users = value;
        RaisePropertyChanged();
    }
}

public RelayCommand<User> UserSelectedCommand
{
    get { return _userSelectedCommand; }
}

protected override sealed void SetCommands() // called in the constructor which is in turned called by SimpleIoc
{
     userSelectedCommand = new RelayCommand<User>((user) => UserSeriesSelected(user));
}

private void UserSelected(User selectedUser)
{

}

3 个答案:

答案 0 :(得分:10)

在数据模板中使用命名元素绑定作为绑定源,以从根数据上下文访问命令。您可以使用根网格或其他容器作为命名元素。 ItemsControl iteself也可以使用。

<ItemsControl x:Name="MyItems" ItemsSource="{Binding Users}"
              Margin="{StaticResource ContentMargin}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Margin="{StaticResource ImageButtonMargin}"
                    Style="{StaticResource ImageButtonStyle}"
                    Command="{Binding ElementName=MyItems,  Path=DataContext.UserSelectedCommand}"
                    CommandParameter="{Binding}">
                    <!--...-->

答案 1 :(得分:4)

您需要添加&#34; FindAncestor&#34;到你的相对来源绑定: RelativeSource = {RelativeSource FindAncestor, AncestorType = {x:Type ItemsControl}}

答案 2 :(得分:-2)

在我看来,您应该更改策略,将命令放在User类中,并从该类通过事件通知视图模型。 这将简化您的xaml代码,在我看来,使您的视图模型更加连贯。