[英]Forcing a ListBox to re-render
背景 :
我有一個列表框,其中包含由DataTemplates定義的項目。 現在,如果列表中的對象的IsEditable屬性設置為true,則該項目的屬性信息將顯示在文本框內(通過DataTemplate更改),而不是文本塊(以便用戶可以編輯該列表項的內容)
通過每個列表項內部的按鈕可以打開/關閉IsEditable。 有人告訴我,我們需要保持所有對象的狀態一致,這意味着我不能僅僅重新綁定ItemsSource並丟失所有內容。
目前,我正在使用它來重新渲染:
this.lbPoints.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
題:
前面提到的代碼片段KIND OF發揮了作用。 我所說的“種類”最終會導致我的數據重新呈現,但是只有當我滾動到列表的底部然后又滾動回到我要重新呈現的項目時,才可以。
1) 如何立即重新渲染數據,而無需滾動顯示它?
你們評論的人是對的,因為您使用的是錯誤的方式... 幾乎不需要強制ListBox
重新呈現 。 您可能在嘗試切換DataTemplate
使自己更加痛苦(盡管有可能)。 取而代之的是,考慮將TextBox.IsReadOnly
屬性綁定到IsEditable
屬性的數據:
<TextBox IsReadOnly="{Binding IsEditable}" Text="{Binding Text}" />
另一種選擇是,當IsEditable
屬性為true
時,使用BooleanToVisibilityConverter
在DataTemplate
顯示不同的Grid
。 不幸的是,該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>
您還可以定義自己的具有IsInverted
屬性的BooleanToVisibilityConverter
類,以便僅使用一個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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.