C# 使用DataTemplate时未更改WPF ListBox所选项目

C# 使用DataTemplate时未更改WPF ListBox所选项目,c#,wpf,xaml,listbox,C#,Wpf,Xaml,Listbox,我的列表框绑定到一个项目源,selecteditem属性也被绑定。我的大部分工作都是在selecteditem属性中完成的。实际上我有两个列表框,对于第一个列表框中的每个项目,集合中都有一些子项目。对于在第一个列表框中选择的所有项,其子项应添加到第二个列表框中 问题是选择项目(通过选中复选框)不会引发SelectedItem属性更改 我的列表框控件的XAML是 <ListBox SelectionMode="Multiple" ItemsSource="{Binding Charts,M

我的列表框绑定到一个项目源,selecteditem属性也被绑定。我的大部分工作都是在selecteditem属性中完成的。实际上我有两个列表框,对于第一个列表框中的每个项目,集合中都有一些子项目。对于在第一个列表框中选择的所有项,其子项应添加到第二个列表框中

问题是选择项目(通过选中复选框)不会引发SelectedItem属性更改

我的列表框控件的XAML是

 <ListBox SelectionMode="Multiple" ItemsSource="{Binding Charts,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedChart, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
          <ListBox.ItemTemplate>
                <DataTemplate>
                     <CheckBox Content="{Binding ChartName}" VerticalAlignment="Center" IsChecked="{Binding IsChartSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                 </DataTemplate>
            </ListBox.ItemTemplate>
</ListBox>

<ListBox ItemsSource="{Binding Tracks, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate >
                    <StackPanel Orientation="Horizontal">
                        <CheckBox  VerticalAlignment="Center" IsChecked="{Binding IsTrackSelected}"/>
                        <TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Text="{Binding TrackName}"/>
                    </StackPanel>
                </DataTemplate>
   </ListBox.ItemTemplate>
这种绑定没有任何意义:

<CheckBox IsChecked="{Binding IsTrackSelected,
  RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" />

您计划如何在复选框已选中/未选中的视图模型中获取通知。由于绑定属性是实体的一部分,并且它不会在VM中引发任何事件。啊,我没有看到
SelectedItem
绑定,因为它在屏幕外。在这种情况下,我以前关于使用
ItemsControl
的评论只适用于第二个曲目列表。当您在第一个列表中切换复选框时,父项<代码>ListBoxItem是否会被选中?否父项不会被选中,这才是真正的问题。你能很快为我澄清一件事吗:你允许检查图表列表中的多个项目吗?换句话说,复选框状态是否独立于
列表框中的选择?是的,用户可以选择多个项目。我尝试了selectionmode=multiple和mode=twoway,并在selecteditem属性上更改了updatesourcetrigger=property。
<CheckBox IsChecked="{Binding IsTrackSelected,
  RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" />
private void OnChartCheckBoxGotKeyboardFocus(
    object sender,
    KeyboardFocusChangedEventArgs e)
{
    var checkBox = sender as CheckBox;
    if (checkBox == null)
        return;

    var listBoxItem = ItemsControl.ContainerFromElement(ChartsList, checkBox)
                      as ListBoxItem;
    if (listBoxItem != null)
        listBoxItem.IsSelected = true;
}