0

我有一个使用 XAML 的 Windows 商店应用程序,其中我有一个类型的绑定:

DelegateCommand<DomainObject>

我正在尝试绑定 DomainObject 的列表,如下所示。注意项目模板中的按钮,触发 StartCommand:

<ItemsControl
    x:Name="MyList"
    ItemsSource="{Binding Path=Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Style="{StaticResource Para}">
                <Image>
                    <Image.Source>
                        <BitmapImage UriSource="{Binding Path=Image}" />
                    </Image.Source>
                </Image>

                <TextBlock Text="{Binding Path=Name}" Width="300" />

                <Button Content="Start"
                    Command="{Binding Path=StartCommand}"
                    CommandParameter="{Binding}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

在视图模型中,我有以下内容:

public DelegateCommand<DomainObject> StartCommand
{
    get { return _startCommand; }
    set
    {
        _startCommand = value;
                //method I use to fire the property changed event
        this.NotifyPropertyChanged("StartCommand");
    }
}

我通过以下方式实例化命令实例:

StartCommand = new DelegateCommand<DomainObject>(StartSession);

但是,当单击按钮时,它永远不会触发命令......我在 StartSession 中的断点没有被命中。我哪里出错了?是我如何设置命令或参数吗?我想不通。另请注意,ItemsControl 中的项目绑定到 DomainObject 的实例,所以我想将它作为 CommandParameter 传递,这就是为什么我认为我搞砸了......

4

1 回答 1

3

这不起作用的原因是DataContext内部的ItemTemplate. 该行:

<Button Content="Start"
        Command="{Binding Path=StartCommand}"
        CommandParameter="{Binding}"/>

将绑定到类StartCommand中的属性DomainObject,而不是您的视图模型。绑定到正确的 DataContext (你的ItemsControl,不是你ItemContainer的绑定的那个)需要一个小的调整:

<Button Content="Start"
        Command="{Binding Path=DataContext.StartCommand, 
                          RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
        CommandParameter="{Binding}"/>

这样,WPF 绑定将找到类型的祖先ItemsControl 并绑定到DataContext.StartCommand属性(假设DataContext是您的视图模型)。

于 2013-07-01T01:59:02.070 回答