web-dev-qa-db-fra.com

C # WPF ListBox Checkbox Liaison IsChecked à un champ et IsSelected?

J'essaie de lier un CheckBox à un champ mais aussi de déclencher l'IsSelected de la case à cocher. 

Voici la configuration ListBox qui fonctionne avec la liaison aux données

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding Checked ,Mode=TwoWay}"/>
      </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Et voici le code associé à la liaison 

public MainWindow()
{
    InitializeComponent();

    List<CheckBoxListItem> items1 = new List<CheckBoxListItem>();
    items1.Add(new CheckBoxListItem(true, “home”));
    items1.Add(new CheckBoxListItem(false, “work”));
    items1.Add(new CheckBoxListItem(true, “cell”));
    lstExclude.ItemsSource = items1;
}

public class CheckBoxListItem
{
   public bool Checked { get; set; }
   public string Text { get; set; }

   public CheckBoxListItem(bool ch, string text)
   {
     Checked = ch;
     Text = text;
    }
}

Cela lie correctement la case à cocher cochée, mais si je coche la case (cochée ou décochée), je veux qu’il sélectionne l’élément.

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/>
      </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Donc, cela me donne le résultat de cocher la case (cocher ou décocher) et cela sélectionnera l'élément. Le problème est maintenant que le champ Vérifié n'est pas lié lorsque j'ajoute les éléments.

Comment pouvez-vous obtenir que la case à cocher soit à la fois liée au champ Vérifié ET que le travail IsSelected soit toujours actif?

10
user3573191

Ok, j'ai répondu à ma propre question (et il y aurait peut-être lieu de faire cela alors n'hésitez pas à ajouter), j'ai ajouté un événement Click à la case comme suit

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
 <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding Checked ,Mode=TwoWay}" Click="CheckBox_Click"/>
      </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

puis ajouté ce code pour l'événement Click

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    var cb = sender as CheckBox;
    var item = cb.DataContext;
    lstExclude.SelectedItem = item;
}

Désormais, l'élément est sélectionné lorsque vous cliquez sur la case à cocher (cochée ou non) et qu'il est disponible pour la méthode 'lstExclude.SelectedIndex'. 

J'espère que cela aidera tout le monde à venir avec le même problème. 

3
user3573191

Cela permettrait-il de lier les deux propriétés de l'interface utilisateur à la propriété de modèle d'objet Checked?

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="IsSelected" Value="{Binding Checked, Mode=OneWay}"/>
    </Style>
</ListBox.ItemContainerStyle>

<ListBox.ItemTemplate>
   <DataTemplate>
      <CheckBox Content="{Binding Text}" IsChecked="{Binding Checked}"/>
   </DataTemplate>
</ListBox.ItemTemplate>
14
Rachel

vous pouvez utiliser une MultiBinding avec MultiConverter

<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource YourMultiBindConverter}"> 
                <Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/> 
                <Binding Path="Checked"/> 
 </MultiBinding> 
</CheckBox.IsChecked>

et créez un YourMultiBindConverter qui implémente IMultiValueConverter

2
erradi mourad
 <CheckBox Padding="10" 
           IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type  
                                                 ListBoxItem}}, Path=IsSelected}">
        <CheckBox.LayoutTransform>
                  <ScaleTransform ScaleX="1" ScaleY="1" />
        </CheckBox.LayoutTransform>
  </CheckBox>
1
Ramji