0

我在 WPF 中创建了一个 ListBox,它执行以下操作:

它绑定到我的 ViewModel 中的数据源。ListBox 包含项目,每个项目旁边是一个复选框。如果用户单击 CheckBox,则项目被选中,命令将被执行。它工作正常,WPF 的代码如下所示:

    <ListBox ItemsSource="{Binding OCAntwort}" SelectedItem="{Binding SelectedAntwort}" >
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid>
                                <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>

                                    <!--ElementName=Window is the Name of the XAML (in root definition)-->
                                    <CheckBox DataContext="{Binding DataContext, ElementName=Window}" Command="{Binding CheckAnswer}" CommandParameter="{Binding ElementName=cbox, Path=IsChecked}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}" x:Name="cbox" HorizontalAlignment="Right"/>
                                </Grid>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.Resources>
    </ListBox>

现在我在 Windows Store App 上尝试相同的方法,但是没有 AncestorType ... 如果我这样做:

<Style TargetType="ListBoxItem" x:Name="lbitem">

<CheckBox DataContext="{Binding DataContext, ElementName=Window}" Command="{Binding CheckAnswer}" CommandParameter="{Binding ElementName=cbox, Path=IsChecked}" IsChecked="{Binding ElementName=lbitem, Path=IsSelected}" x:Name="cbox" HorizontalAlignment="Left"/>

复选框消失,它只会显示 OCAntwort 的 ItemsSource。单击一个项目不会执行 CheckBox 的命令(因为没有 CheckBox)。这样做:

IsChecked="{Binding ElementName=lbitem, Path=IsSelected,RelativeSource={RelativeSource Mode=Self}}"

将显示 CheckBox 并执行命令,但它没有绑定到 SelectedItem。

如何将 CheckBox(显示在每个 ListBoxItem 的 ListBoxItem 旁边)绑定到 ListBox 的 SelectedItem?工作代码在上面......我希望代码应该在我的 Windows Store 应用程序(以及稍后在我的 Windows Phone 应用程序)中工作。

例子:

您可以在此处下载示例:http ://weblogs.asp.net/marianor/archive/2008/02/04/multiselect-listview-with-checkboxes-in-wpf.aspx

这显示了我想在 Windows Store App 中实现的目标。

编辑:这样做会显示带有内容和 CheckBox 的 ListBox,但我仍然需要通过 SelectedItem 绑定 CheckBox。表示当用户单击 CheckBox 时,必须选择 ListBoxItem,或者如果用户单击 ListBoxItem,则必须选择 CheckBox。

    <ListBox ItemsSource="{Binding OCAntwort}" SelectedItem="{Binding SelectedAntwort}" Grid.Row="2" Grid.Column="1" x:Name="listBox" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Text}" Width="150" VerticalAlignment="Center"/>
                    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
4

2 回答 2

2

不确定您是否找到了解决方案,但我使用以下代码在IsCheckedaCheckBoxIsSelected属性和父属性ListBoxItemListViewItem.

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"/>
于 2013-10-11T17:04:46.267 回答
0

您应该在 ListBoxItem 中写入时使用 TemplatedParent。

IsChecked="{Binding ElementName=lbitem, 
            Path=IsSelected,
            RelativeSource={RelativeSource Mode=TemplatedParent}}"

我认为这可能会解决您的问题。

于 2013-06-24T07:37:46.287 回答