it-swarm.com.de

Checkbox-Bindung von C # WPF-ListBox an ein Feld überprüft und ausgewählt?

Ich versuche, eine CheckBox an ein Feld zu binden, löse aber auch das Kontrollkästchen IsSelected aus.

Hier ist das ListBox-Setup, das mit der Bindung an Daten arbeitet

<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>

Und hier ist der Code, der der Bindung zugeordnet ist

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;
    }
}

Dies bindet den aktivierten Wert des Kontrollkästchens korrekt, aber wenn ich auf das Kontrollkästchen klicke (aktiviert oder deaktiviert), möchte ich, dass es das Element auswählt, also habe ich es auf diese Weise versucht

<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>

Hierdurch erhalte ich die Ergebnisse, wenn ich auf das Kontrollkästchen klicke (Aktivieren oder Deaktivieren) und das Element auswähle. Das Problem ist nun, dass das markierte Feld nicht gebunden ist, wenn ich die Elemente hinzufüge.

Wie können Sie das Kontrollkästchen so einstellen, dass es sowohl an das Feld "Aktiviert" gebunden ist als auch weiterhin mit "IsSelected" funktioniert?

10
user3573191

Ok, ich habe meine eigene Frage beantwortet (und da ist es besser, dies zu tun, also fügen Sie einfach hinzu). Ich habe dem Kontrollkästchen ein Klickereignis hinzugefügt

<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>

und fügte dann diesen Code für das Click-Ereignis hinzu

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

Das Element wird jetzt ausgewählt, wenn Sie auf das Kontrollkästchen klicken (aktiviert oder deaktiviert), und das Element steht der Methode 'lstExclude.SelectedIndex' zur Verfügung 

Ich hoffe, das hilft allen, die mit dem gleichen Problem kommen. 

3
user3573191

Funktioniert es, beide UI-Eigenschaften an die Objektmodelleigenschaft Checked zu binden?

<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

sie können eine MultiBinding mit MultiConverter verwenden.

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

und erstellen Sie einen YourMultiBindConverter der IMultiValueConverter implementiert

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