Bind StackPanel.Visibility to the Visibility property of its children

后端 未结 2 700
半阙折子戏
半阙折子戏 2021-01-13 12:47

I\'m relatively new to DataBinding and just reading into it. What I want to do is the following:

I have a StackPanel with a number of child controls:



        
相关标签:
2条回答
  • 2021-01-13 13:21

    I can not think of a way to do this directly through databinding.

    Personally I would have a view model behind the view, and set the views DataContext to the view model.

    In the view model I would then have a property telling the view if all the textboxes are collapsed. That property would be set by code. Then bind the stackpanel visibility to that property.

    (The property must either be a dependancy property, or the view model must implement INotifyPropertyChanged for the view to automatically update)

    0 讨论(0)
  • 2021-01-13 13:42

    Have you considered setting the visibility of the TextBoxes to Hidden? This will "hide" the space that is assigned for the TextBoxes. Assuming their are no other controls in the StackPanel, then it will not be visible.

    Of course, this solution may make some naive assumptions about your implementation.

    If you need the more complex scenario, I would attempt the following: Note: This is psuedocode - may not compile..

    1) Use a 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) Declare the Converter

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

    3) Define the Converter

    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;
      }
    }
    
    0 讨论(0)
提交回复
热议问题