0

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

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

选中复选框后,我应该执行一个在此处运行良好的命令。但问题是我必须将 ProjectId 作为命令参数发送。我在这里失败了。

我尝试使用此链接中的 datacontextspy 。命令和命令参数的不同数据上下文

在这里,我能够获取 Viewmodel 的数据上下文,而不是选中复选框的项目的 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>

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

提前致谢, 普拉尚斯

4

2 回答 2

0

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

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

<DataTemplate x:Key="ProjectTemplate">
<TextBlock...../>
<CheckBox....../>
</DataTemplate>

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

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

CommandParameter="{Binding Path=DataContext.ProjectID, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}"
于 2013-07-02T20:40:27.690 回答
0

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

http://mvvmlight.codeplex.com/

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

于 2013-07-02T20:51:09.200 回答