2016-09-03 34 views
0

我有一個ListBox這樣的:如果綁定值爲空,則隱藏項目?

<ListBox VerticalAlignment="Stretch" 
     ItemsSource="{Binding EventInfo}"> 

裏面我有一個DataTemplate與TextBlock的列表:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="20"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Event:" FontWeight="Bold" Grid.Column="0" Grid.Row="0"/> 
      <TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="1" Grid.Row="0"/> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

什麼,我需要做的,例如當隱藏的文本塊,綁定的值是null。我有聯想這個東西:

Event: foo 

但在某些情況下,Name是空的,我需要隱藏兩TextBlockEvent和綁定的,是可能做到這一點?

UPDATE:

我想這樣做純粹在XAML爲:

<Style TargetType="TextBlock"> 
    <Style.Triggers> 
      <Trigger Property="Text" Value=""> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
    </Style.Triggers> 
</Style> 

的問題就這麼在中斷模式和XAML錯誤的應用程序秋天,我得到:

System.Windows.Data Error: 40 : BindingExpression path error: 'Name' property not found on 'object' ''Style' (HashCode=7)'.

這個錯誤是爲每個文本塊重複我已經做錯了什麼?

回答

1

你可以通過一個靜態布爾轉換器

<local:BooleanToVisibiltyConverter x:Key="myBoolToVisibilityConverter" /> 

知名度綁定屬性

Visibility="{Binding IsVisibleName, Converter={StaticResource myBoolToVisibilityConverter}} 

所有必須/可以被隱藏的元素。

然後轉換器將真正轉化爲可見光

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    bool isVisible = (bool)value; 
    return (isVisible ? Visibility.Visible : Visibility.Collapsed); 
} 

然後你將它們設置當條件滿足,例如像(這是一個總的想法,我不知道你的具體細節)在名稱的setter(你必須配置所有其他觸發器以及)

public string Name 
{ 
    get { return name;} 
    set 
    { 
     name = value; OnPropertyChanged("Name"); 
     IsVisibleName = name != null; IsVisibleEvent = event != null && name != null; 
    } 
} 

在純XAML有數據觸發器

<Style.Triggers> 
    <DataTrigger Binding="{Binding SomeValue}" Value=" x:Null "> 
     <Setter Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
</Style.Triggers> 
+0

是不可能做到這一點只在純XAML? – AgainMe

+0

是的,你可以在純xaml中定義數據觸發器,但我個人發現setter方法更清晰和更強大......我將編輯我的答案以插入xaml觸發器的示例以及 –

+0

你能否看到我的更新?我試圖在xaml中完成這項工作,但我想我的代碼中有些問題。 – AgainMe

1

儘管在這裏可以使用NullToVisibilityConverter,但您可能會發現ListBox中存在可疑間隙,其中(摺疊的)TextBlock應該是由於ListBoxItemContainer周圍的填充而引起的。更糟糕的是,這個「缺口」仍然可以由用戶選擇。

這些問題雖然也使用類似於NullToVisbilityConverter我非常鼓勵你從EventInfo在你的視圖模型,其中的邏輯關於什麼應該呈現給用戶過濾掉這些值的方法(但不包括解決應該如何提供)應該被定位。

+0

男人,我希望在跳進我的答案之前閱讀此內容。你的方法是正確的 - 只需將基礎列表置於「ObservableCollection」中,並從那裏過濾出空值,然後將列表框綁定到ObservableCollection並在相關的代碼點執行notifypropchange(例如,項目在基地列表) – code4life

相關問題