OK J'en ai un bizarre ici. Ce que j'essaie de comprendre, c'est comment avoir une listview, peuplée par une ObservableCollection, mettre à jour une autre ListView, peuplée par une autre ObservableCollection, basée sur la sélection de la première listview puis utiliser un convertisseur de valeurs pour cocher ou décocher une case basée sur la sélection combinée avec l'élément actuel dans la deuxième liste. Cette partie je travaille quelque peu en utilisant la liaison multiple, mais la partie qui m'a bloqué est quand je coche ou décoche un élément dans la deuxième listview je dois pouvoir attraper cet événement et tous les articles actuellement vérifiés dans cette listview une mise à jour une champ de base de données basé sur cela.Listage multiple multisélection ListView
Je sais que cela peut ne pas avoir beaucoup de sens et je me bats sur la façon de le rendre plus clair, mais ci-dessous est le xaml pour les deux listviews et le code pour le convertisseur. Je peux voir que lorsque je coche ou décoche une case dans la liste de lecture secodn que le convertisseur essaye de faire la méthode ConvertBack qui explose, mais si je la mets juste à zéro, alors le code ne souffle plus, mais la case est surlignée en rouge comme une erreur de validation s'est produite. Je ne suis même pas sûr que la multibinding est la voie à suivre ici et j'ai regardé la liste multisélectionnelle de Josh Smith, mais avec la conversion nécessaire, je ne vois pas non plus comment l'implémenter avec succès.
Si quelqu'un a des idées, je l'apprécierais grandement. Aussi mes excuses si je n'ai pas expliqué mon besoin très clairement, mais j'espère avec la description chaotique et le code que vous pouvez voir où je vais avec.
Merci d'avance!
Première ListView qui alimente le second
<Grid>
<ListView x:Name="listRule" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="3,3,3,3" ItemsSource="{Binding RuleListing}" exts:Selected.Command="{Binding RuleSelectedCommand}" SelectedIndex="0">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName}" ToolTip="{Binding Path=Expression}" FontWeight="Bold"/>
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Description}" FontStyle="Italic" />
<TextBlock Text=")"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
Deuxième ListView avec convertisseur et multiliaison
<Grid HorizontalAlignment="Stretch">
<Grid.Resources>
<converters:RuleToRoleBooleanConverter x:Key='RuleRoleConverter' />
<DataTemplate x:Key="RoleTemplate">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="200"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding RoleName}" HorizontalAlignment="Left" Margin="3,0,0,0" Grid.Column="0" />
<CheckBox HorizontalAlignment="Right" Margin="0,0,3,0" Grid.Column="1">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource RuleRoleConverter}">
<Binding ElementName="listRule" Path="SelectedItem" />
<Binding Path="RoleName"/>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</Grid>
</DataTemplate>
</Grid.Resources>
<ListView Name="listRoles" ItemsSource="{Binding RoleListing}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
SelectionMode="Multiple" ItemTemplate="{StaticResource ResourceKey=RoleTemplate}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsRoleSelected}"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
Value Converter
public class RuleToRoleBooleanConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0] != null && values[1] != null)
{
string expression = ((EliteExtenderRule)values[0]).Expression;
string role = values[1].ToString();
if (expression.Contains("R:*") || expression.Contains("R:" + role))
{
return true;
}
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;// new object[] { (bool)value, null };
}}