2009-02-20 76 views
4

我對DataBinding比較新,只是讀入它。 我想要做的是以下幾點:將StackPanel.Visibility綁定到其子級的Visibility屬性

我有一個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> 

文本框的可見性屬性可以通過代碼進行更改。 現在,如果所有文本框設置爲可見性=摺疊,我也希望StackPanel.Visibility設置爲摺疊,但如果顯示一個或多個文本框(可見性=可見),StackPanel.Visibility也應設置爲可見。

這可以通過簡單的DataBinding來實現還是必須在C#代碼中實現此功能?

回答

5

您是否考慮將文本框的可見性設置爲Hidden?這將「隱藏」分配給文本框的空間。假設它們在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; 
    } 
} 
+2

小錯誤:轉換器= {StaticResource的visibilityConverter}應該繼續MultiBinding.Bindings代替能見度 – 2010-05-10 20:37:12

7

我想不出通過數據綁定直接做到這一點的方法。

就我個人而言,我會在視圖背後有一個視圖模型,並將視圖DataContext設置爲視圖模型。

在視圖模型中,我會有一個屬性告訴視圖是否所有的文本框都被摺疊。該屬性將由代碼設置。然後將該堆棧面板可見性綁定到該屬性。

(該屬性必須是一個扶養屬性,或視圖模型必須執行INotifyPropertyChanged爲視圖自動更新)

相關問題