如何从代码中选择ListView中的复选框 - WPF

时间:2018-06-12 20:42:55

标签: wpf listview checkbox binding

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

sys.getsizeof()

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

我尝试使用INotifyPropertyChanged为Person实现类包装器,但我无法正确地使用它进行绑定。

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

1 个答案:

答案 0 :(得分:2)

考虑使用IMultiValueConverter。

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

AllChildrens 集合中的Foreach元素,转换器会检查该元素是否包含在 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();
    }
}