2016-12-19 1 views
1

Ich habe zwei ItemsControls mit der gleichen ItemsSource. Einer hat einige Kontrollen für jedes Einzelteil, das andere hat einen checkbox für jedes Einzelteil. Die Steuerelemente in ihnen werden dynamisch hinzugefügt. Wie kann ich die visibility der ersten ItemsControls an die entsprechende checkbox in der anderen ItemsControls binden?Ändern Sie die Sichtbarkeit eines Artikels Steuerelement über Kontrollkästchen in einem anderen

Hier ist das erste ItemsControl mit mehreren TextBlocks in der Zeile. Hinweis: Ich möchte die gesamte Reihe der Steuerelemente ausblenden.

<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock /> 
       <TextBlock /> 
       <TextBlock /> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Hier ist die zweite ItemsControl mit dem checkboxes:

<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <CheckBox Content="{Binding Name}" 
          IsChecked="True" /> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Also, was passiert ist, für jedes Element in VehicleCollection, eine neue Reihe von textblocks hinzugefügt wird zum ersten ItemsControl und ein checkbox hinzugefügt wird für die zweite ItemsControl. Diese sollten sich beispielsweise aufeinander beziehen: Wenn ich das erste Kontrollkästchen deaktiviere, sollte die erste Zeile für die anderen ItemsControl ausgeblendet werden.

Ich weiß, wie man den booltovis Konverter macht, nur nicht sicher, wie man diese zwei ItemsControls in Beziehung setzt.

Edit: Diese sind beide im Hauptfenster.xaml übrigens.

Antwort

2

Um ein Element des ersten Items, fügen Sie eine IsVisible Eigenschaft zu Ihrer Fahrzeugklasse (dh des Elementtyp der VehicleCollection) und bindet die Visibility des Elements ContentPresenter zum IsVisible Eigenschaft in einem ItemContainerStyle ein- oder auszublenden:

<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="ContentPresenter"> 
      <Setter Property="Visibility" 
        Value="{Binding IsVisible, 
          Converter={StaticResource BooleanToVisibilityConverter}}"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      ... 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

im anderen Items binden die IsChecked Eigenschaft des CheckBox zum IsVisible Eigenschaft:

<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Name}" IsChecked="{Binding IsVisible}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Stellen Sie sicher, dass die Klasse Fahrzeug INotifyPropertyChanged implementiert und das Ereignis PropertyChanged auslöst, wenn sich die Eigenschaft IsVisible ändert.

2

Sie sollten in der Lage sein, dies zu verwalten, indem Sie eine boolesche Eigenschaft in Ihrer Vehicle Klasse hinzufügen, die vermutlich die Grundlage für Ihre VehicleCollection ist. Etwas wie: IsSelected.

Dann können Sie Ihre XAML ändern, wie unten dargestellt:

<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <TextBlock Visibility="{Binding IsSelected,Converter={StaticResource boolToVisConverter}}"/> 
      <TextBlock Visibility="{Binding IsSelected,Converter={StaticResource boolToVisConverter}}"/> 
      <TextBlock Visibility="{Binding IsSelected,Converter={StaticResource boolToVisConverter}}"/> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 


<ItemsControl ItemsSource="{Binding VehicleCollection}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <CheckBox Content="{Binding Name}" 
         IsChecked="{Binding IsSelected}" /> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Diese ungetestet XAML ist, wie ich es gerade in die Antwort eingegeben haben. Vielleicht brauchen Sie eine Feinabstimmung.

Verwandte Themen