我的列表框绑定到项目源,并且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>
我的图表选择已更改视图模型中的属性
public ChartSourceForMultipleSelection SelectedChart
{
get { return _selectedChart; }
set
{
_selectedChart = value;
ChartSelectionChanged();
NotifyPropertyChanged("SelectedChart");
}
}
答案 0 :(得分:1)
<击> 这种约束没有任何意义:
<CheckBox IsChecked="{Binding IsTrackSelected,
RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" />
这会尝试绑定到外部IsTrackSelected
上的属性ListBoxItem
,但不存在此类属性。如果RelativeSource
是基础数据项的属性,则此处看起来您不需要IsTrackSelected
。
击>
另外,我不确定你为什么选择ListBox
作为曲目集合;看起来您的轨道选择概念与所选项目的ListBox
概念是分开的。为什么不使用简单的ItemsControl
?
关于您的主要问题,项目模板中的CheckBox
正在吃鼠标/焦点事件,这些事件通常会告诉ListBox
在点击时选择父ListBoxItem
。只要内部ListBoxItem
获得键盘焦点,您就可以手动更新CheckBox
的选择状态。
将GotKeyboardFocus="OnChartCheckBoxGotKeyboardFocus"
添加到您的图表列表项模板的CheckBox
,为图表列表框指定一个名称,例如x:Name="ChartsList"
,并在后面的代码中编写处理程序:
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;
}