2014-03-18 41 views
0

背景強制列表框重新呈現

我有一個包含由的DataTemplates定義的項目的列表框。現在,如果列表中的某個對象的屬性IsEditable設置爲true,則該項目的屬性信息將顯示在文本框內(通過DataTemplate更改),而不是文本塊(因此用戶可以編輯該列表項目的內容)

IsEditable被每個列表項的內部打開/關閉通過一個按鈕。我被告知我們需要保持所有對象的狀態一致,這意味着我不能重新綁定ItemsSource並丟失所有東西。

目前,我使用這個重新渲染:

this.lbPoints.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { })); 

問:

上述代碼片段形式的它的工作。所謂「樣」,我的意思是,它最終使我的數據成爲再次呈現,但只有當我滾動到列表的底部,然後向上滾動網頁我試圖重新渲染的項目。

1)我怎樣才能重新渲染立即將數據,而不必四處滾動,以得到它的出現?

+0

爲什麼不直接綁定到一個文本框和公正IsReadOnly結合IsEditable(你將需要另一個財產,使bool或在轉換器中做) – Paparazzi

+2

你可能這樣做都是錯誤的。您應該使用'DataTrigger'來動態更改DataTemplates的內容或其他內容。或者在「IsReadOnly」時創建一個看起來像常規的「TextBlock」的「TextBox」。 –

回答

1

評論的人是正確的,你要對這個錯誤的方式...有很少需要ListBox重新呈現。你可能會造成自己的一些額外的悲痛嘗試切換DataTemplate S(雖然它可能)。取而代之的是,想想數據TextBox.IsReadOnly屬性綁定到你的IsEditable屬性:

<TextBox IsReadOnly="{Binding IsEditable}" Text="{Binding Text}" /> 

另一種方法是使用BooleanToVisibilityConverter顯示在您的DataTemplate不同Grid當你IsEditable屬性是true。不幸的是,Converter沒有相反的操作,因此您可以創建一個IsNotEditing屬性,以綁定到最初顯示的DataTemplate中的Grid。我不知道這是明確的......看到這個例子:

<DataTemplate DataType="{x:Type YourPrefix:YourDataType}"> 
    <Grid> 
     <Grid Visibility="{Binding IsNotEditing, Converter={StaticResource 
      BooleanToVisibilityConverter}}"> 
      <!-- Define your uneditable UI here --> 
     </Grid> 
     <Grid Visibility="{Binding IsEditing, Converter={StaticResource 
      BooleanToVisibilityConverter}}"> 
      <!-- Define your editable UI here --> 
     </Grid> 
    </Grid> 
</DataTemplate> 

你也可以定義自己的BooleanToVisibilityConverter類,它具有一個IsInverted屬性,因此,你可以只使用一個IsEditing財產。你需要聲明兩個Converters的是,像這樣的:

<Converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" /> 
<Converters:BoolToVisibilityConverter x:Key="InvertedBoolToVisibilityConverter" 
    IsInverted="True" /> 

那麼你的XAML會是這樣的:

<Grid Visibility="{Binding IsEditing, Converter={StaticResource 
    InvertedBoolToVisibilityConverter}}"> 
    <!-- Define your uneditable UI here --> 
</Grid> 
<Grid Visibility="{Binding IsEditing, Converter={StaticResource 
    BoolToVisibilityConverter}}"> 
    <!-- Define your editable UI here --> 
</Grid>