2011-12-13 71 views
0

我已經看過這個解決方案:Show if ItemsControl.ItemsSource is null。 我通過代碼隱藏將ItemsControl的DataContext設置爲ObservableCollection。一切工作正常,但它只在加載階段解決一次。如果項目控件在開始時有幾個項目,則文本會消失,但不會在以後出現。如果它是空的,文本出現,但是當我稍後添加項目時它不會消失。我也嘗試過ItemsSource,但沒有運氣。我意識到即時通訊使用控件模板,我可以使用相對源代碼TemplatedParent,但我只是想確保。進一步測試後,我嘗試添加/刪除列表中的項目後,轉換器功能似乎沒有激活,即使項目顯示在我的itemscontrol上。ItemsControl DataContext綁定錯誤

<ItemsControl x:Name="MedicationList" ItemTemplate="{StaticResource UserTemplate}"> 
    <ItemsControl.Template> 
    <ControlTemplate TargetType="ItemsControl"> 
     <Grid> 
     <TextBlock Text="No Items to Display" Visibility="{Binding DataContext, ElementName=MedicationList, Converter={StaticResource AnyItemsToVisibilityConverter}}" /> 
     <ItemsPresenter /> 
     </Grid> 
    </ControlTemplate>  
    </ItemsControl.Template> 
</ItemsControl> 
+0

您不應該調查爲什麼DataContext會發生變化嗎? – 2011-12-13 19:49:00

+0

我試圖將我的Datacontext分配從UserControl_Loaded事件移動到InitializeComponent();並且DataContext null問題消失了。我把轉折點放入我的轉換函數中,並且它只在賦值過程中執行一次,但從來沒有當我添加/刪除項目時 – 2011-12-13 19:56:48

回答

3

你用什麼作爲datacontext/itemssource?如果它是我所期望的ObservableCollection,那麼您最好將其綁定到其「Count」屬性,然後在必要時使用觸發器摺疊文本塊。

綁定當前未更新的原因是DataContext本身實際上並未發生更改。 DataContext上的屬性會改變,所以如果綁定到正確的屬性(count),綁定將會更新。

這段代碼應該工作:

<ControlTemplate TargetType="ItemsControl"> 
    <Grid> 
    <TextBlock x:Name="txtBlock" Text="No Items to Display" Visibility="Collapsed" /> 
    <ItemsPresenter /> 
    </Grid> 
    <ControlTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=Count}" Value="0"> 
     <Setter TargetName="txtBlock" Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

通過使用數據觸發就可以避免需要一個轉換器,將數值轉換成可見性,並保持在您的.xaml一切。