2014-04-25 8 views
9

Ich versuche, eine CheckBox an ein Feld zu binden, aber auch die IsSelected des Kontrollkästchens auszulösen. HierC# -WPF-ListBox Checkbox-Bindung wird zu einem Feld überprüft und IsSelected?

ist die List-Box-Setup, das mit der Bindung an Daten

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

arbeitet Und hier ist der Code im Zusammenhang mit der Bindung

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 das Kontrollkästchen aktiviert Wert korrekt, aber wenn Ich klicke auf das Kontrollkästchen (aktiviert oder deaktiviert), ich möchte, dass es das Element auswählt, also habe ich versucht, es so zu machen

Dies gibt mir die Ergebnisse des Klickens auf das Kontrollkästchen (aktivieren oder deaktivieren) und es wird das Element auswählen. Das Problem ist jetzt das Kontrollkästchen ist nicht gebunden, wenn ich die Elemente hinzufügen.

Wie können Sie das Kontrollkästchen sowohl an das Feld "Checked" gebunden UND weiterhin die IsSelected arbeiten lassen?

+0

können Sie ein Multibing und einen MultiValueConverter verwenden –

Antwort

3

Ok, antwortete ich meine eigene Frage (und es wäre vielleicht besser, dies zu tun, so fühle Baum zu fügen) Ich fügte ein Click-Ereignis zum Checkbox wie so hinzu

<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 dann hinzugefügt diesen Code für das Click-Ereignis

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

nun das Element ausgewählt wird, wenn Sie das Kontrollkästchen klicken (aktiviert oder deaktiviert) und der Artikel ist auf die ‚lstExclude.SelectedIndex‘ Methode

verfügbar

Ich hoffe, dass dies jedem hilft, mit dem gleichen Problem zu kommen.

14

Würde es funktionieren, 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> 
+0

Super! Das funktioniert perfekt. Danke und danke für die schnelle Antwort. – user3573191

+0

Eigentlich gibt es ein Problem (und es ist wegen meiner Formulierung meiner Frage) - Ich möchte das Element ausgewählt werden, wenn Sie auf das Kontrollkästchen klicken (unabhängig davon, ob es aktiviert ist oder nicht) - Sorry. Irgendwelche Ideen? Vielen Dank. – user3573191

+0

@ user3573191 In der Vergangenheit habe ich einen 'DataTrigger' verwendet, der' IsSelected = "True" 'setzt, wenn' IsKeyboardFocusWithin' gleich true ist. Die Syntax sieht ungefähr so ​​aus [http://stackoverflow.com/a/8680879/302677]. Meinst Du das? – Rachel

2

Sie ein MultiBinding mit MultiConverter

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

und erstellen Sie eine YourMultiBindConverter können dass IMultiValueConverter implementieren

+0

Eigentlich gibt es ein Problem (und es ist wegen meiner Formulierung meiner Frage) - Ich möchte das Element ausgewählt werden, wenn Sie auf das Kontrollkästchen klicken (unabhängig davon, ob es aktiviert ist oder nicht) Ich aktualisierte die Frage - Sorry. Irgendwelche Ideen? Vielen Dank. – user3573191

+0

Das hat mir sehr geholfen, da ich nicht an einen bestimmten Wert in meinem Modell binden musste, sondern an eine Liste von Werten. Mein Kunde wollte, dass in der Listbox sowohl Checks als auch Highlights angezeigt wurden, und das half mir, dorthin zu gelangen. Vielen Dank. – Tronald

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