为列表框内的复选框绑定命令和命令参数WPF / MVVM的不同源

时间:2013-07-02 19:40:36

标签: wpf mvvm prism

我是WPf,MVVM的新手,这是我在stackoverflow中的第一个问题。 我将继续讨论我的问题,然后我将继续讲述到目前为止我发现的问题。

在视图中,我有一个列表框,它绑定到一个列表,例如ProjectList,它有ProjectId,Name,Description和IsFavourite(bool)。在项目模板中,我给了一个复选框。

选中复选框后,我应该执行一个工作正常的命令,直到这里。但问题是我必须将ProjectId作为命令参数发送。我在这里失败了。

我尝试过使用此链接中的datacontextspy。 Different Datacontext for Command and CommandParameter

这里我可以获取Viewmodel的datacontext,而不是选中其复选框的项目的ProjectId。

这是我的.xaml代码。

<ListBox Name="lstProjects" ItemsSource="{Binding ProjectList}" HorizontalAlignment="Stretch" SelectedItem="{Binding SelectedProject}">
   <ListBox.Resources>
       <local:DataContextSpy x:Key="spy"/>
   </ListBox.Resources>
   <TextBlock Grid.Column="1" Grid.Row="1" Grid.RowSpan="3" 
    Text="{Binding ProjectDescription}" FontSize="10" TextWrapping="Wrap" />

    <CheckBox Name="chkFavourites" Grid.Column="1" Grid.Row="1" Content="Favoutires"                                                   
CommandParameter="{Binding Path= DataContext,Source={StaticResource spy}}"
Command="{Binding Path=IsSelected}"  DataContext="{Binding DataContext, 
RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}">
</CheckBox>
</ListBox>

有些人可以帮我解决这个问题。如果我在这里遗漏任何细节,请告诉我。

提前致谢, 普拉香特

2 个答案:

答案 0 :(得分:0)

调查xaml和数据绑定的好工具是Snoop。 http://snoopwpf.codeplex.com/

查看代码,您应该为ListBox定义一个包含TextBlock和CheckBox的DataTemplate。然后,您可以使用ListBox上的ItemTemplate属性并将其设置为数据模板。这样每个ListBoxItem都将具有Project。

类型的DataContext
<DataTemplate x:Key="ProjectTemplate">
<TextBlock...../>
<CheckBox....../>
</DataTemplate>

<ListBox ItemTemplate="{StaticResource ProjectTemplate}" ...... />

因此,您希望将CommandParameter绑定到Project的属性(如ProjectID)(当您在ListBox中有一个Porjects集合时)我认为这是您需要的xaml。

CommandParameter="{Binding Path=DataContext.ProjectID, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}"

答案 1 :(得分:0)

我推荐MVVM Light Toolkit,它是MVVM和MV的最佳框架。 WPF。

http://mvvmlight.codeplex.com/

有关http://www.galasoft.ch/mvvm/的更多信息。