2017-02-14 14 views
0

Как я могу установить свои CheckBoxes внутри моего ListBox для отключения?Как я могу установить свои CheckBoxes внутри моего списка ListBox для отключения

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

Проблема: Я пытаюсь отключить мой CheckBox-х динамически, которые находятся внутри моего списка. Но когда я отключу ListBox, он также отключает мою вертикальную полосу прокрутки. Итак, теперь я думаю, что я должен получить доступ к CheckBoxes внутри Listbox внутри моего GroupBox, а затем отключить их один за другим. Как я могу это сделать?

Я попытался это, но не везло:

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

Я хочу сказать, как:

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

Заранее спасибо

+0

Попробуйте связать свойство IsEnabled. – Dexion

ответ

2

Вы должны добавить IsEnabled свойство к вашему MyItemsClassThing и реализовать интерфейс INotifyPropertyChanged:

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

И связать IsEnabled свойства CheckBox этого свойство:

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

Вы можете просто установить IsEnabled свойства MyItemsClassThing объектов в исходной коллекции, чтобы отключить Checkbox:

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

К сожалению, он скомпилирован, но не работает. – Yusha

+0

Как именно вы устанавливаете коллекцию MyItemsClassThing ItemsSource? Предполагается, что это IEnumerable . Затем он должен работать, если вы правильно применили INotifyPropertyChanged. Пожалуйста, разместите свой полный код. – mm8

+0

Кажется, я сделал человеческую ошибку в подражании вашему коду. Я заработал. Спасибо за блестящее решение! Большое спасибо моему другу! Это действительно помогло! – Yusha