【问题标题】:How to select checkbox in ListView from code - WPF如何从代码中选择 ListView 中的复选框 - WPF
【发布时间】:2026-01-30 01:45:02
【问题描述】:

我有一个带有这样复选框的 ListView:

<ListView 
    x:Name="usersListView"
    Width="300"
    ItemsSource="{Binding}"
    IsSynchronizedWithCurrentItem="True"
    SelectionChanged="childrenListView_SelectionChanged"
    Background="{StaticResource BackgroundPrimaryBrush}"
    Foreground="{StaticResource WhiteBrush}"
    Grid.Row="6" Grid.ColumnSpan="2"
    >
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Tag="{Binding Id}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding FullName}" Header="Name" Width="250"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

ListView 中的所有复选框都来自数据库中的 List 'AllUsers'。 现在我想在后面的代码中将特定的复选框设置为 IsChecked=True。 我有另一个列表“儿童”,其中只有少数“AllUsers”元素。 我想要的是显示 ListView 与选中的复选框绑定到“儿童”中的人。

我尝试自己使用 INotifyPropertyChanged 实现的类包装器来实现这一点,但我无法使用它正确绑定。

我希望我确实正确地解释了这个问题。 提前谢谢你:)

【问题讨论】:

  • 将要选择的项目的Id属性设置为true。

标签: wpf listview checkbox binding


【解决方案1】:

考虑使用 IMultiValueConverter。

在下面的示例中,我的 Children 对象是一个带有名称的简单字符串。我有两个列表,AllChildrens 列表和 SelectedChildrens 列表。

对于 AllChildrens 集合中的每个元素,转换器会检查该元素是否包含在 SelectedChildrens 集合中。

XAML:(我已删除事件)

<ListView ItemsSource="{Binding AllChildrens}" Tag="{Binding SelectedChildrens}">
    <ListView.Resources>
        <local:IEnumerableContainsConverter x:Key="Contains" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Content="{Binding}">
                                <CheckBox.IsChecked>
                                    <MultiBinding Converter="{StaticResource Contains}">
                                        <Binding Path="." />
                                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListView}}" Path="Tag" />
                                    </MultiBinding>
                                </CheckBox.IsChecked>
                            </CheckBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding FullName}" Header="Name" Width="250"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

视图模型:

public class Model
{
    public Model()
    {
        AllChildrens = new List<string>()
        {
            "James",
            "Annabelle",
            "Kevin",
            "William",
            "Joseph",
        };

        SelectedChildrens = new List<string>()
        {
            "James",
            "Annabelle",
            "William",
        };
    }

    public List<string> AllChildrens { get; set; }
    public List<string> SelectedChildrens { get; set; }
}

转换器:

class IEnumerableContainsConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values != null &&
            values.Length == 2 &&
            values[0] is string current_children && // Replace with your children object type
            values[1] is IEnumerable<string> selected) // Replace with your children object type
        {
            return selected.Contains(current_children);
        }

        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

    最近更新 更多