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?
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.
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>
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
<CheckBox Padding="10"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
ListBoxItem}}, Path=IsSelected}">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="1" ScaleY="1" />
</CheckBox.LayoutTransform>
</CheckBox>