通过另一个中的复选框更改一个itemscontrol的可见性

时间:2016-12-19 17:35:38

标签: c# wpf checkbox visibility

我有两个ItemsControls具有相同的ItemsSource。一个对每个项目有一些控制,另一个对每个项目都有checkbox。它们中的控件是动态添加的。如何将第一个visibility的{​​{1}}绑定到另一个ItemsControls中的相应checkbox

这是第一个包含行中多个ItemsControls的ItemsControl。注意:我想隐藏整行控件。

TextBlocks

这是第二个<ItemsControl ItemsSource="{Binding VehicleCollection}"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <TextBlock /> <TextBlock /> <TextBlock /> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> ItemsControl

checkboxes

所以会发生的情况是,<ItemsControl ItemsSource="{Binding VehicleCollection}"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <CheckBox Content="{Binding Name}" IsChecked="True" /> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> 中的每个项目都为第一个VehicleCollection添加了新的textblocks行,并为第二个ItemsControl添加了checkbox ItemsControl。这些应该相互关联,例如:如果我取消选中第一个复选框,则应隐藏另一个ItemsControl的第一行。

我知道怎么做booltovis转换器,只是不确定如何关联这两个ItemsControls。

编辑:顺便说一下,这些都在mainwindow.xaml中。

2 个答案:

答案 0 :(得分:2)

你应该能够通过在Vehicle类中添加一个布尔属性来管理它,我认为这是你VehicleCollection的基础。类似于:IsSelected

然后您可以修改您的XAML,如下所示:

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

这是未经测试的XAML,因为我只是将其输入到答案中。可能需要调整。

答案 1 :(得分:2)

为了显示或隐藏第一个ItemsControl的项目,将IsVisible属性添加到Vehicle类(即VehicleCollection的元素类型)并绑定Visibility的{​​{1}}项目ContentPresenter IsVisible中的ItemContainerStyle属性:

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

在其他ItemsControl中,将CheckBox的IsChecked属性绑定到IsVisible属性:

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

当然要确保类Vehicle实现INotifyPropertyChanged并在PropertyChanged属性更改时触发IsVisible事件。