2009-08-27 54 views
3

我有綁定到一個ObservableCollection動態選項卡的選項卡控制選項卡控件這就是一個標籤項如下:WPF:躲在綁定到一個觀察集合

<TabControl ItemsSource="{Binding AllTabs}" SelectedIndex="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
        <!--.............. --> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 

     <TabControl.ContentTemplate> 
      <DataTemplate DataType="{x:Type vm:TabViewModel}"> 
       <c:MyTabItem/> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 

所以,標籤的標題和內容定義動態地分配爲可觀察的集合更改。現在,我想隱藏一些標籤而不在後面的集合中刪除它們 - 爲了在標籤重新打開時保持數據。

理想情況下,每個聊天選項卡viewmodel具有默認情況下設置爲true的IsVisible屬性。然而,我在哪裏綁定這樣一個屬性,以使一個標籤項目崩潰?

回答

6

如果你可以修改你vm:TabViewModel我要你的可見性更改爲可見性屬性,並使用下面的ContentTemplate:

<TabControl.ContentTemplate> 
    <DataTemplate DataType="{x:Type vm:TabViewModel}"> 
     <c:MyTabItem Visibility={Binding Visibility}/> 
    </DataTemplate> 
</TabControl.ContentTemplate> 

否則,你可以使用一個轉換爲布爾ISVISIBLE更改爲能見度枚舉:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Data; 
using System.Windows; 

namespace Something.Converters 
{ 
    [ValueConversion(typeof(bool), typeof(Visibility))] 
    public class BoolToVisibilityConverter : IValueConverter 
    { 

     #region IValueConverter Members 
     /// <summary> 
     /// Converts a value. 
     /// </summary> 
     /// <param name="value">The value produced by the binding source.</param> 
     /// <param name="targetType">The type of the binding target property.</param> 
     /// <param name="parameter">The converter parameter to use.</param> 
     /// <param name="culture">The culture to use in the converter.</param> 
     /// <returns> 
     /// A converted value. If the method returns null, the valid null value is used. 
     /// </returns> 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is bool && targetType == typeof(Visibility)) 
      { 
       bool val = (bool)value; 
       if (val) 
        return Visibility.Visible; 
       else 
        if (parameter != null && parameter is Visibility) 
         return parameter; 
        else 
         return Visibility.Collapsed; 
      } 
      throw new ArgumentException("Invalid argument/return type. Expected argument: bool and return type: Visibility"); 
     } 

     /// <summary> 
     /// Converts a value. 
     /// </summary> 
     /// <param name="value">The value that is produced by the binding target.</param> 
     /// <param name="targetType">The type to convert to.</param> 
     /// <param name="parameter">The converter parameter to use.</param> 
     /// <param name="culture">The culture to use in the converter.</param> 
     /// <returns> 
     /// A converted value. If the method returns null, the valid null value is used. 
     /// </returns> 
     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is Visibility && targetType == typeof(bool)) 
      { 
       Visibility val = (Visibility)value; 
       if (val == Visibility.Visible) 
        return true; 
       else 
        return false; 
      } 
      throw new ArgumentException("Invalid argument/return type. Expected argument: Visibility and return type: bool"); 
     } 
     #endregion 
    } 
} 

Inculde在XAML命名空間(您的根元素,窗口在本示例):

<Window xmlns:converters="clr-namespace:Something.Converters" 
.../> 

而在你的資源:

<Window.Resources> 
    <converters:BoolToVisibilityConverter x:Key="boolToVisibilityConverter"/> 
</Window.Resources> 

而且finaly綁定:

<TabControl.ContentTemplate> 
    <DataTemplate DataType="{x:Type vm:TabViewModel}"> 
     <c:MyTabItem Visibility={Binding IsVisible, Converter={StaticResource boolToVisibilityConverter}, ConverterParameter=Visibility.Collapsed}/> 
    </DataTemplate> 
</TabControl.ContentTemplate> 

我認爲是它:)

編輯:嗷,改變ConverterParameter到Visibility.Collapsed能見度。隱藏起來;)

+0

完美運作!謝謝:) – bluebit 2009-08-28 08:40:45

+1

我試過這種確切的情況,但它只是使TabItem的內容崩潰。有任何想法嗎? – Jordan 2014-01-22 21:08:54

1

我建議使用CollectionView。這有點像一個集合的抽象視圖,你可以看到它的一個過濾部分。通過綁定到CollectionView而不是集合本身,你應該只能看到你想要的,而集合仍然在後臺。

+0

CollectionView絕對是一個選項,但如果列表動態更改(即項目被添加,刪除或更新),我們無法使用CollectionView。在這些情況下,綁定可見性是唯一的選擇。對於靜態集合,CollectionView是最好的解決方案。 – Amit 2011-12-14 14:38:15

0

我試過了,但沒有得到預期的結果。在TabControl.ContentTemplate中綁定可見性的以下方法會導致隱藏選項卡的內容而不隱藏選項卡標題本身。

<TabControl.ContentTemplate> <DataTemplate DataType="{x:Type vm:TabViewModel}"> <c:MyTabItem Visibility={Binding Visibility}/> </DataTemplate> </TabControl.ContentTemplate>

仍然戰鬥了隱藏選項卡標題本身。

4

得到了正確的答案與this answer

<TabControl.ItemContainerStyle> 
    <Style TargetType="{x:Type TabItem}"> 
    <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource boolToVisibilityConverter}"/> 
    </Style> 
</TabControl.ItemContainerStyle> 

的幫助下從BOOL到使用公開程度爲轉換System.Windows.Controls.BooleanToVisibilityConverter。

Scott對使用CollectionView的建議也很有前途。