2013-11-21 56 views
0

我有一個ItemsControl顯示消息列表。它被定義爲...ItemsControl項目綁定調用時崩潰

<ItemsControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
       ItemsSource="{Binding Messages}" > 
</ItemsControl> 

然後我有一個DataTemplate處理每個消息的顯示。它被定義爲...

<DataTemplate DataType="{x:Type vm:MessageViewModel}"> 
    <Button Command="{Binding CommandOpenPage}"> 
     <Button.Template> 
      <ControlTemplate> 
       <Border Margin="2" BorderThickness="1" 
         BorderBrush="{Binding Flags, Converter={StaticResource msgFlagConverter}}" 
         Background="{Binding Flags, Converter={StaticResource msgFlagConverter}, ConverterParameter=1}" > 
        <TextBlock Text="{Binding Path=Message}" Style="{StaticResource ActionItem}" TextWrapping="Wrap" /> 
       </Border> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
</DataTemplate> 

一切都顯示OK。我的問題是當父控件設置爲可見性=摺疊我的ItemsControl仍然通過DataTemplate併爲每個MessageViewModel調用BorderBrush和BackgroundBrush的轉換器。

這很麻煩,因爲當列表非常大時,會設置綁定並在不應該轉換的時候執行轉換。該列表僅在用戶選擇查看時纔可見。我瞭解綁定引擎會忽略摺疊父項下的元素。這個規則是否有例外?或者我只是想念一些東西?

+0

我已經試過你的代碼,我沒有得到所謂的轉換器。確保你沒有改變視圖模型,特別是消息數據,或者你沒有改變數據上下文(重新設置)等。 – frno

+0

使用ListBox代替,你將啓用虛擬化。即使你有5K項目,也只有10個將被顯示,並且它們的轉換器將被調用。 –

+0

frno - 在驗證期間,消息列表確實發生了很大變化。如果父元素被摺疊,我仍然期望綁定被忽略。 – Jayson

回答

0

我發現我的問題。上面的ItemsControl和DataTemplate在UserControl中。可見性最初是通過將主佈局網格綁定到可見性屬性在usercontrol內部處理的。通過簡單地設置父XAML中的用戶控件可見性,所有綁定開始按預期行事。

這解決了我的問題,但我仍然不明白設置主佈局網格的可見性與usercontrol本身的可見性之間的差異。

<c:ApplicationMenuView Grid.Column="1" Grid.Row="4" 
         HorizontalAlignment="Left" Margin="1" 
         VerticalAlignment="Stretch" 
         DataContext="{Binding Menu}" 
         Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>