Привязать StackPanel.Visibility к свойству Visibility его дочерних элементов. - PullRequest
4 голосов
/ 20 февраля 2009

Я относительно новичок в DataBinding и просто читаю его. Я хочу сделать следующее:

У меня есть StackPanel с несколькими дочерними элементами управления:

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

Свойство visibility текстовых полей может быть изменено кодом. Теперь, если все TextBoxe s установлены на Visibility=Collapsed, я также хочу StackPanel.Visibility установить на Collapsed, но если один или несколько TextBoxe s показаны (Visibility=Visible), StackPanel.Visibility также следует установить на Visible.

Может ли это быть достигнуто с помощью простой привязки данных или мне нужно реализовать эту функцию в коде C #?

Ответы [ 2 ]

7 голосов
/ 20 февраля 2009

Я не могу придумать способ сделать это напрямую через привязку данных.

Лично у меня была бы модель представления позади представления, и установил бы представления DataContext к модели представления.

В модели представления у меня было бы свойство, показывающее, свернуты ли все текстовые поля. Это свойство будет установлено кодом. Затем свяжите видимость стековой панели с этим свойством.

(свойство должно быть свойством зависимости, или модель представления должна реализовывать INotifyPropertyChanged для автоматического обновления представления)

5 голосов
/ 20 февраля 2009

Рассматривали ли вы установить видимость текстовых полей на 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...