Bind StackPanel.Visibility to the visibility property of their children

I am relatively new to DataBinding and just reading. I want to do the following:

I have a StackPanel with several child controls:

        <StackPanel Orientation="Horizontal">
            <TextBox x:Name="textbox1" Width="100">1</TextBox>
            <TextBox x:Name="textbox2" Width="100">2</TextBox>
            <TextBox x:Name="textbox3" Width="100">3</TextBox>
        </StackPanel>

The visibility property of text fields can be changed by code. Now, if all text fields are set to Visibility = Collapsed, I also want StackPanel.Visibility to be set to Collapsed, but if one or more text fields (Visibility = Visible) is shown, StackPanel.Visibility must also be set to Visible.

Is it possible to do this with a simple DataBinding or do I need to implement this functionality in C # code?

+4
source share
2 answers

.

DataContext .

, , . . .

( , INotifyPropertyChanged )

+7

, TextBoxes Hidden? "" , . , StackPanel, .

, .

, : . psuedocode - .

1) MultiBinding

<StackPanel>
  <StackPanel.Visibility Converter={StaticResource visibilityConverter}>
    <MultiBinding.Bindings>
      <Binding ElementName="textBox1" Path="Visibility" />
      <Binding ElementName="textBox2" Path="Visibility" />
      <Binding ElementName="textBox3" Path="Visibility" />
    </MultiBinding.Bindings>
  </StackPanel.Visibility>
</StackPanel>

2)

<Window.Resources>
  <local:VisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>

3)

public class VisibilityConverter : IMultiValueConverter
{
  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  {
    Visibility text1Vis = (Visibility)values[0];
    Visibility text2Vis = (Visibility)values[1];
    Visibility text3Vis = (Visibility)values[2];

    if (text1Vis == text2Vis == text3Vis == Visibility.Collapsed)
      return Visibility.Collapsed;

    return Visibility.Visible;
  }
}
+5

All Articles