我有一个使用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传递,这就是为什么我认为我把它搞砸了......
答案 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
是您的视图模型)。