Wpf 如何获取ListView复选框列状态
因此,我有Wpf 如何获取ListView复选框列状态,wpf,listview,checkbox,Wpf,Listview,Checkbox,因此,我有列表视图和复选框列: <GridViewColumn Header="Name"> <GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> <CheckBox Margin="0,0,0,0"/>
列表视图
和复选框
列
:
<GridViewColumn Header="Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<CheckBox Margin="0,0,0,0"/>
<TextBlock x:Name="textBlock"
Text="{Binding Name}"
Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}"
Style="{StaticResource TextBlockDefaultStyle}"
Margin="0,2,0,0"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
我的模型有几个属性
,如名称
,说明
等,我的列表视图
也包含简单的复选框
我的ListView
填充了几个对象,我想实现两件事:
复选框
我希望所有其他复选框
变成取消选中
(如果我有另一个复选框
处于选中状态)对象
为什么要替换RadioButton中的复选框?我希望选项选择“无”。我已修改答案,将其更改为
复选框
。OK看起来不错,但如何仅启用1个复选框?(我的意思是,如果选中了特定复选框,并且我想选中不同的复选框,那么我想取消选中第一个复选框)我的意思是,我只想选中一个复选框,所以当我选中复选框时,我想让其他复选框变为未选中。调整后的回答:选中一个复选框时,取消选中其他复选框。如何设置或绑定ListView的ItemsSource属性。请发布视图模型的代码。很多时候,当我看到
时,作者实际上想要
(可以单击某些文本以选中复选框)。只是一个旁注提示,也许你想要与其他人不同的东西;)
<ListView x:Name="MyListView" SelectionChanged="MyListView_OnSelectionChanged" SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox>
<CheckBox.IsChecked>
<Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
</CheckBox.IsChecked>
</CheckBox>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Description" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// some data for testing
MyListView.ItemsSource = new List<MyData>
{
new MyData {Name = "123", Description = "ABC"},
new MyData {Name = "456", Description = "EFG"},
new MyData {Name = "789", Description = "HIJ"},
};
}
private void MyListView_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems != null && e.AddedItems.Count > 0)
{
var selectedItem = (MyData)e.AddedItems[0];
// do something
}
}
}
public class MyData
{
public string Name { get; set; }
public string Description { get; set; }
}
<CheckBox Checked="ToggleButton_OnChecked">
<CheckBox.IsChecked>
<Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
</CheckBox.IsChecked>
</CheckBox>
private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
{
foreach (var checkBox in FindAllCheckBoxes(MyListView).Where(x => !ReferenceEquals(x, sender)))
{
checkBox.IsChecked = false;
}
}
private static IEnumerable<CheckBox> FindAllCheckBoxes(Visual element)
{
if (element == null)
{
return null;
}
var checkBoxes = new List<CheckBox>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
var visual = VisualTreeHelper.GetChild(element, i) as Visual;
var checkBox = visual as CheckBox;
if (checkBox != null)
{
checkBoxes.Add(checkBox);
}
else
{
checkBoxes.AddRange(FindAllCheckBoxes(visual));
}
}
return checkBoxes;
}