2017-02-14 2 views
0

Wie kann ich meine CheckBoxen innerhalb meiner ListBox deaktivieren?Wie kann ich meine CheckBoxen innerhalb meiner ListBox deaktivieren

XAML:

<GroupBox Header="A GroupBox" BorderThickness="2" Width="247" HorizontalAlignment="Left" VerticalAlignment="Top" Height="183" Margin="405,155,0,0"> 
    <Grid> 
     <ListBox Name="MyListBoxThing" ItemsSource="{Binding MyItemsClassThing}" Height="151" Width="215" HorizontalAlignment="Left" VerticalAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Auto" Margin="10,0,0,0"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" /> 
         <TextBlock Text="{Binding Path=Name}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</GroupBox> 

Mainwindow.xaml.cs

public class MyItemsClassThing 
{ 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
} 

Das Problem: Ich versuche, meine CheckBox die dynamisch das Innere meines listbox sind zu deaktivieren. Aber wenn ich die ListBox deaktiviere, wird auch meine vertikale Bildlaufleiste deaktiviert. So, jetzt denke ich, dass ich auf die CheckBoxes innerhalb der Listbox innerhalb meiner GroupBox zugreifen und sie nacheinander deaktivieren sollte. Wie kann ich das machen?

Ich versuchte dies, hatte aber kein Glück:

var children = LogicalTreeHelper.GetChildren(MyListBoxThing); 
foreach(var item in children) 
{ 
    var c = item as CheckBox; 
    c.IsEnabled = false; 
} 

ich wie sagen will:

loop through the listbox 
    if you find a check box 
     checkbox.isenabled = false 
    endif 
end 

Vielen Dank im Voraus

+0

Versuchen Sie, die IsEnabled-Eigenschaft zu binden. – Dexion

Antwort

2

Sie sollten eine IsEnabled Eigenschaft hinzufügen Ihren MyItemsClassThing und implementieren Sie die INotifyPropertyChanged Schnittstelle:

public class MyItemsClassThing : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 

    private bool _isEnabled = true; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 
     set { _isEnabled = value; OnPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

und binden die IsEnabled Eigenschaft des CheckBox dieser Eigenschaft:

foreach(var item in MyListBoxThing.Items.OfType<MyItemsClassThing>()) 
{ 
    item.IsEnabled = false; 
} 
:

<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" IsEnabled="{Binding IsEnabled}" /> 

können Sie das einfach einstellen die IsEnabled Eigentum der MyItemsClassThing Objekte in Ihrer Quellensammlung die Checkbox deaktivieren

+0

Leider kompiliert es aber hat nicht funktioniert. – Yusha

+0

Wie genau legen Sie dann die MyItemsClassThing ItemsSource-Auflistung fest? Dies sollte ein IEnumerable sein. Dann sollte es funktionieren, vorausgesetzt, Sie haben die INotifyPropertyChanged korrekt implementiert. Bitte posten Sie Ihren vollständigen Code. – mm8

+0

Es scheint, dass ich einen menschlichen Fehler gemacht habe, als ich Ihren Code nachgeahmt habe. Ich habe es zur Arbeit gebracht. Danke für die brillante Lösung! Sehr geschätzt mein Freund! Das hat wirklich geholfen !! – Yusha

Verwandte Themen