我有一个WPF ListBox,我有复选框,但是获取被检查项目列表的方法是什么?
ListBox是绑定到Dictionary<T>
的数据。
这是XAML:
<Window x:Class="WpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300">
<Grid Margin="10">
<ListBox ItemsSource="{DynamicResource Nodes}" Grid.IsSharedSizeScope="True" x:Name="MyList">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="Key" />
<ColumnDefinition SharedSizeGroup="Name" />
<ColumnDefinition SharedSizeGroup="Id" />
</Grid.ColumnDefinitions>
<CheckBox Name="NodeItem" Click="OnItemChecked">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="2" Text="{Binding Value.Name}" Grid.Column="1"/>
<TextBlock Margin="2" Text="-" Grid.Column="2"/>
<TextBlock Margin="2" Text="{Binding Value.Id}" Grid.Column="3"/>
</StackPanel>
</CheckBox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
答案 0 :(得分:2)
这通常通过ViewModel完成,ViewModel是一种数据结构,它向模型(您的数据)和特定于视图的信息(如是否检查项目)公开(通过DataContext)。
在你的例子中,你的词典不会是一个词典,而是一个词典,而PersonViewModel会有一个IsChecked属性和一个指向模型的Person属性。
否则,您必须在模板中找到复选框或从复选框中找到列表框项目,这很复杂。
答案 1 :(得分:2)
Josh Smith在代码项目上有一个article,可以解释你需要什么。他正在讨论TreeView
,但原则也会移到CheckBox
。
还有一个非常有趣的方法here使用DataTemplate
并将CheckBox.IsChecked
属性绑定到ListBoxItem.IsSelected
属性。
如果您是MVVM的新手,Jason Dolinger有关于此主题的精彩视频。它将引导您完成从使用代码隐藏文件到完整MVVM模式(包括依赖注入和测试)的过程。