我有一个带有这样的复选框的ListView:
sys.getsizeof()
ListView中的所有复选框都来自数据库中的List'AllUsers'。 现在我想在后面的代码中将特定的复选框设置为IsChecked = True。 我有另一个List'Children',其中只有少数'AllUsers'元素。 我想要的是显示ListView与选中的复选框绑定到'儿童'中的人。
我尝试使用INotifyPropertyChanged为Person实现类包装器,但我无法正确地使用它进行绑定。
我希望我确实正确地解释了这个问题。 提前谢谢你:)
答案 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();
}
}