我是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>
有些人可以帮我解决这个问题。如果我在这里遗漏任何细节,请告诉我。
提前致谢, 普拉香特
答案 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/的更多信息。