1

我正在使用 PRISM 开发 wpf 应用程序。这是我的第一个 WPF 应用程序,我发现自己处于无法前进的境地。

我的场景是这样的,我有一个与 ListBox 绑定的组列表,您可以将其称为父 ListBox,每个组对象都有一个与之关联的用户列表,并且我将该列表与嵌套在其中的另一个 ListBox 绑定父列表框。如您在此处看到的,两种绑定都工作正常:

在此处输入图像描述

我面临两个问题。

1.我可以分别选择组和单个用户,但它们不同步,这意味着如果我选择一个用户,那么包含该用户的组不会被选中。我试过 IsSynchronizedWithCurrentItem="True" 但这似乎不起作用。

如果有人能指出正确的方向如何实现这一点,或者除了在 ListBox 中使用 ListBox 之外还有其他方法,我将不胜感激。

2.我有一个与父 ListBox 关联的上下文菜单,并且我能够成功地将命令与菜单绑定,但是我在将命令与嵌套的 ListBox 上下文菜单绑定时遇到了麻烦,这是我的代码

<ListBox x:Name="lstOfGroups" 
             ItemsSource="{Binding CurrentContest.Groups}"
             SelectedItem="{Binding SelectedGroup}"
             ItemTemplate="{StaticResource GroupTemplate}"
             Style="{StaticResource ListBoxStyle1}"
             ItemContainerStyle="{StaticResource ListBoxItemStyle1}"
             Background="Transparent" SelectionMode="Single"
             IsSynchronizedWithCurrentItem="True"
             Height="400">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal" Margin="5" Width="1200"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>

                <ListBox.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Add Contestant" Command="{Binding AddGroupCommand}"/>
                        <MenuItem Header="Edit Contestant" Command="{Binding EditGroupCommand}"/>
                        <MenuItem Header="Delete Contestant" Command="{Binding DeleteGroupCommand}"/>
                    </ContextMenu>
                </ListBox.ContextMenu>
            </ListBox>

<DataTemplate x:Key="GroupTemplate" >
        <Border x:Name="spPubItemBorder" Margin="3" BorderBrush="Black" BorderThickness="1" CornerRadius="10" Background="Honeydew">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <StackPanel Orientation="Horizontal">
                    <TextBlock Name="tbGroupName" Grid.Column="0" Style="{StaticResource ItemTextBox}">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}Group Name: {0}">
                            <Binding Path="Name" />
                        </MultiBinding>
                    </TextBlock.Text>
                    </TextBlock>
                    <TextBlock Name="tbGroupAmount" Grid.Column="1" Style="{StaticResource ItemTextBox}">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}Group Amount: {0}">
                            <Binding Path="Amount" />
                        </MultiBinding>
                    </TextBlock.Text>
                    </TextBlock>
                </StackPanel>
                <!--<ItemsControl ItemsSource="{Binding ContestantList}"
                              AlternationCount="2" ItemTemplate="{StaticResource ContestantTemplate}">

                </ItemsControl>-->
                <ListBox x:Name="lstOfContestant" Grid.Row="1"
                     ItemsSource="{Binding ContestantList}"
                     SelectedItem="{Binding SelectedContestant, ElementName=lstOfGroups}"
                     ItemTemplate="{StaticResource ContestantTemplate}"
                     Style="{StaticResource ListBoxStyleForContestant}"
                     ItemContainerStyle="{StaticResource ListBoxItemStyleForContestant}"
                     Background="Transparent" SelectionMode="Single"
                     Height="Auto">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation="Horizontal" Margin="5" Width="375"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>

                    <ListBox.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Add Contestant" Command="{Binding Path=DataContext.AddContestantCommand,ElementName=contestantManager}"/>
                            <MenuItem Header="Edit Contestant" Command="{Binding Path=DataContext.EditContestantCommand,ElementName=contestantManager}"/>
                            <MenuItem Header="Delete Contestant" Command="{Binding Path=DataContext.DeleteContestantCommand,ElementName=contestantManager}"/>
                        </ContextMenu>
                    </ListBox.ContextMenu>
                </ListBox>

            </Grid>
        </Border>
    </DataTemplate>

我想知道是否有人也可以在这里为我指明正确的方向。

提前致谢。

4

1 回答 1

1

对于 #1,将IsSelected组 ListBox 的属性设置为 true,如果IsKeyboardFocusWithin

<Style x:Key="GroupListBoxItemStyle" TargetType="ListBoxItem">
  <Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
      <Setter Property="IsSelected" Value="True" />
    </Trigger>
  </Style.Triggers>
</Style>

ListBoxItem键盘焦点位于ListBoxItem

至于#2,听起来你得到了错误的项目,可能是因为你ElementName在绑定中使用,但是名称设置在多个项目上。尝试使用RelativeSource绑定来查找ContextMenu自身,然后绑定到PlacementTarget.DataContext

<MenuItem Header="Add Contestant"
          Command="{Binding PlacementTarget.DataContext.AddContestantCommand, 
              RelativeSource={RelativeSource FindAncestor, 
              AncestorType={x:Type ContextMenu}}}" />
于 2012-06-12T16:18:28.077 回答