命令不是来自VIew

时间:2013-07-01 01:51:22

标签: c# .net xaml windows-8 windows-store-apps

我有一个使用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传递,这就是为什么我认为我把它搞砸了......

1 个答案:

答案 0 :(得分: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是您的视图模型)。