2016-06-20 2 views
0

У меня есть Grid с объектами StackPanel.Пытается установить видимость StackPanel с привязкой, если видны еще 1 StackPanels

Панель справа имеет 4 вертикальные ToggleButton объектов.

В 4 соответствующие StackPanel объекты с помощью Связывание для Visbility. Пример:

<StackPanel x:Name="panelMaterialAndSettings" Grid.Row="3" Background="WhiteSmoke" Margin="2" 
      Visibility="{Binding IsChecked, ElementName=buttonMaterialAndSettings, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}"> 

Он отлично работает. Проблема, с которой я не могу разобраться, - это родительский StackPanel. Это также необходимо связать свойство Vibility, но shoudl возвращает true только в том случае, если теперь видны 1 или более из 4 дочерних панелей.

Я могу сделать все с руководством позади кода, если я не могу это исправить.

Или он может проверить 4 ToggleButtons. Но я терплю неудачу.

Markup:

<Grid Grid.Row="1" Grid.RowSpan="4" Grid.Column="2" Margin="2,0,2,2"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="auto" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <StackPanel x:Name="panelExtraFeatures" Visibility="Collapsed" MinWidth="500" Grid.Column="0"> 
     <StackPanel.Background> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="Black" Offset="0"/> 
       <GradientStop Color="{DynamicResource {x:Static SystemColors.AppWorkspaceColorKey}}" Offset="1"/> 
      </LinearGradientBrush> 
     </StackPanel.Background> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
      </Grid.RowDefinitions> 
      <StackPanel x:Name="panelStudentPicker" Grid.Row="0" Background="WhiteSmoke" Margin="2,2,2,10" <StackPanel x:Name="panelStudentPicker" Grid.Row="0" Background="WhiteSmoke" Margin="2,2,2,10" 
          Visibility="{Binding IsChecked, ElementName=buttonStudentPicker, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}"> 
       <Label Content="Student Picker" Background="LightSkyBlue" /> 
       <Label>Panel 1</Label> 
       <Label>Panel 1</Label> 
       <Label>Panel 1</Label> 
       <Label>Panel 1</Label> 
      </StackPanel> 
      <StackPanel x:Name="panelDemonstrationPicker" Grid.Row="1" Background="WhiteSmoke" Margin="2,2,2,10" 
         Visibility="{Binding IsChecked, ElementName=buttonDemonstrationPicker, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}"> 
       <Label Content="DemonStration Picker" Background="LightSkyBlue" /> 
       <Label>Panel 2</Label> 
       <Label>Panel 2</Label> 
       <Label>Panel 2</Label> 
       <Label>Panel 2</Label> 
      </StackPanel> 
      <StackPanel x:Name="panelAssignmentHistory" Grid.Row="2" Background="WhiteSmoke" Margin="2,2,2,10" 
         Visibility="{Binding IsChecked, ElementName=buttonAssignmentHistory, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}"> 
       <Label Content="Assignment History" Background="LightSkyBlue" /> 
       <Label>Panel 3</Label> 
       <Label>Panel 3</Label> 
       <Label>Panel 3</Label> 
       <Label>Panel 3</Label> 
      </StackPanel> 
      <StackPanel x:Name="panelMaterialAndSettings" Grid.Row="3" Background="WhiteSmoke" Margin="2" 
         Visibility="{Binding IsChecked, ElementName=buttonMaterialAndSettings, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}"> 
       <Label Content="Material and Settings" Background="LightSkyBlue" /> 
       <GroupBox Header="Treasures From God's Word:" Margin="2"> 
        <StackPanel HorizontalAlignment="Stretch"> 
         <Label>Bible Reading:</Label> 
         <TextBox/> 
        </StackPanel> 
       </GroupBox> 
       <GroupBox Header="Apply Yourselves To The Field Ministry" Margin="2"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="1*"/> 
          <ColumnDefinition Width="2*"/> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="auto" /> 
          <RowDefinition Height="auto" /> 
          <RowDefinition Height="auto" /> 
          <RowDefinition Height="auto" /> 
          <RowDefinition Height="auto" /> 
          <RowDefinition Height="auto" /> 
         </Grid.RowDefinitions> 
         <Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">Student Assignment #1:</Label> 
         <ComboBox Grid.Row="1" Grid.Column="0" IsEditable="True" SelectedIndex="0" Margin="2"> 
          <ComboBoxItem Content="Initial Call"/> 
          <ComboBoxItem Content="Return Visit"/> 
          <ComboBoxItem Content="Bible Study"/> 
         </ComboBox> 
         <TextBox Grid.Row="1" Grid.Column="1"/> 
         <Label Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">Student Assignment #2:</Label> 
         <ComboBox Grid.Row="3" Grid.Column="0" IsEditable="True" SelectedIndex="1" Margin="2"> 
          <ComboBoxItem Content="Initial Call"/> 
          <ComboBoxItem Content="Return Visit"/> 
          <ComboBoxItem Content="Bible Study"/> 
         </ComboBox> 
         <TextBox Grid.Row="3" Grid.Column="1"/> 
         <Label Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2">Student Assignment #3:</Label> 
         <ComboBox Grid.Row="5" Grid.Column="0" IsEditable="True" SelectedIndex="2" Margin="2"> 
          <ComboBoxItem Content="Initial Call"/> 
          <ComboBoxItem Content="Return Visit"/> 
          <ComboBoxItem Content="Bible Study"/> 
         </ComboBox> 
         <TextBox Grid.Row="5" Grid.Column="1"/> 
        </Grid> 
       </GroupBox> 
      </StackPanel> 
     </Grid> 
    </StackPanel> 
    <StackPanel Grid.Column="1" Margin="2,0,2,2"> 
     <StackPanel.Background> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="{DynamicResource {x:Static SystemColors.ActiveCaptionColorKey}}"/> 
       <GradientStop Color="White" Offset="1"/> 
      </LinearGradientBrush> 
     </StackPanel.Background> 

     <ToggleButton x:Name="buttonStudentPicker" Content="Student Picker" HorizontalAlignment="Right" Margin="2,10,2,10" BorderThickness="0,5,0,0" Background="{x:Null}"> 
      <ToggleButton.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </ToggleButton.LayoutTransform> 
     </ToggleButton> 
     <ToggleButton x:Name="buttonDemonstrationPicker" Content="Demonstrations Picker" HorizontalAlignment="Right" Margin="2,2,2,10" BorderThickness="0,5,0,0" Background="{x:Null}"> 
      <ToggleButton.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </ToggleButton.LayoutTransform> 
     </ToggleButton> 
     <ToggleButton x:Name="buttonAssignmentHistory" Content="Assignment History" HorizontalAlignment="Right" Margin="2,2,2,10" BorderThickness="0,5,0,0" Background="{x:Null}"> 
      <ToggleButton.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </ToggleButton.LayoutTransform> 
     </ToggleButton> 
     <ToggleButton x:Name="buttonMaterialAndSettings" Content="Material and Settings" HorizontalAlignment="Right" Margin="2" BorderThickness="0,5,0,0" Background="{x:Null}"> 
      <ToggleButton.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </ToggleButton.LayoutTransform> 
     </ToggleButton> 
    </StackPanel> 

</Grid> 
+0

Вы пробовали создать другой конвертер, который принимает управляющий элемент в качестве источника привязки, а затем получить доступ к каждой из кнопок, чтобы увидеть, если таковые будут видны или нет ? Только другим способом я вижу это с конвертером с несколькими связями, где вы передаете каждую кнопку для проверки видимости в реализации IMultiValueConverter. Вы пытаетесь вообще избегать любого кода и делать все в XAML? –

+0

@ DavidGlass Спасибо за предложение. С чьей-то поддержкой я смог придумать решение. Спасибо. –

+1

Это в основном то же самое, что и отмеченный дубликат. Единственное отличие заключается в конкретных свойствах. Но это тот же ответ, что и для любого вопроса о форме «как связать два или более исходных свойства с одним целевым свойством?», Например. «Как связать четыре свойства« IsChecked »с единственным свойством« Видимость »?», как вы спрашиваете здесь. –

ответ

0

Кто-то обратил мое внимание о MultiDataTrigger.

Таким образом, я смог найти хорошее resource по этому вопросу.

я смог придумать следующее:

<StackPanel.Style> 
    <Style TargetType="StackPanel"> 
     <Setter Property="Visibility" Value="Visible" /> 
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding ElementName=buttonStudentPicker, Path=IsChecked}" Value="False" /> 
        <Condition Binding="{Binding ElementName=buttonDemonstrationPicker, Path=IsChecked}" Value="False" /> 
        <Condition Binding="{Binding ElementName=buttonAssignmentHistory, Path=IsChecked}" Value="False" /> 
        <Condition Binding="{Binding ElementName=buttonMaterialAndSettings, Path=IsChecked}" Value="False" /> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
</StackPanel.Style> 
Смежные вопросы