将StackPanel.Visibility绑定到其子项的Visibility属性

时间:2009-02-20 11:04:43

标签: c# wpf data-binding xaml

我对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都设置为Visibility=Collapsed,我还希望StackPanel.Visibility设置为Collapsed,但是如果显示一个或多个TextBoxe {{ 1}},(Visibility=Visible)也应设置为StackPanel.Visibility

这可以通过简单的DataBinding实现,还是必须在C#代码中实现此功能?

2 个答案:

答案 0 :(得分:7)

我想不出通过数据绑定直接做到这一点的方法。

我个人会在视图后面有一个视图模型,并将视图DataContext设置为视图模型。

在视图模型中,我将有一个属性告诉视图是否所有文本框都已折叠。该属性将由代码设置。然后将stackpanel可见性绑定到该属性。

(该属性必须是依赖属性,否则视图模型必须实现INotifyPropertyChanged才能使视图自动更新)

答案 1 :(得分:5)

您是否考虑过将TextBoxes的可见性设置为Hidden?这将“隐藏”为TextBox分配的空间。假设它们在StackPanel中没有其他控件,则它将不可见。

当然,这个解决方案可能会对您的实现做出一些天真的假设。

如果您需要更复杂的方案,我会尝试以下方法: 注意:这是伪造的 - 可能无法编译..

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