[英]Modifying an element of “itemsSource” of a ListView doesn't update it
我在WPF中有一個ListView元素,如下所示:
<ListView Grid.Row="6" Margin="10" Name="ObservationsListView" SelectionChanged="ObservationsListView_SelectionChanged_1">
<ListView.View>
<GridView>
<GridViewColumn Header="Observation" Width="122" DisplayMemberBinding="{Binding observationStr}" />
<GridViewColumn Header="Value" Width="122" DisplayMemberBinding="{Binding valueStr}" />
<GridViewColumn Header="Hidden State" Width="122" DisplayMemberBinding="{Binding stateStr}" />
</GridView>
</ListView.View>
</ListView>
我將以下結構綁定到它:
public struct ObservationStatePair
{
public AddressObservationGenerator.Observation observation { get; set; }
public AddressObservationGenerator.Observation state { get; set; }
public string observationStr { get; set; }
public string stateStr { get; set; }
public string valueStr { get; set; }
};
我將一個ObservationStatePair數組設置為ListView的itemsSource,它可以根據需要正確更改其內容。 但此外,我想根據需要修改ListView的itemsSource中當前選擇的ObservationStatePair項的“ stateStr”字段。 為此,我進行了以下修改:
app.currentSequence[ObservationsListView.SelectedIndex].stateStr = selectedState;
ObservationsListView.ItemsSource = app.currentSequence;
ObservationsListView是我的ListView,currentSequence是我要修改的ObservationStatePair對象的數組。 但是,數據源的此更新不會反映在UI中,ListView的內容不會更改。
我在這里想念什么嗎? 為了更新ListView的數據源,我應該另外做什么?
它不起作用的原因有兩個:
您未實現INotifyPropertyChanged
接口,因此綁定系統無法檢測何時更改了屬性值
ObservationStatePair
是一個結構,這意味着它是按value復制的 。 因此,視圖沒有對原始對象的引用。 而是引用了該對象的帶盒裝副本 ,因此,當您修改原始對象時,所做的更改不會反映在視圖引用的對象上。 您應該改用一個類。
通常,您應該始終避免使用可變結構 ,因為它們是錯誤的常見來源。 有關更多詳細信息,請參見此問題: 為什么可變結構是邪惡的?
至於為什么此代碼不起作用:
app.currentSequence[ObservationsListView.SelectedIndex].stateStr = selectedState;
ObservationsListView.ItemsSource = app.currentSequence;
再次設置ItemsSource
無效,因為它與以前的數組相同(我假設currentSequence
是一個數組,否則第一行將不會編譯)。 解決方法是, 可以將ItemsSource
設置為null,然后再次為其分配數組。 但這不是我推薦的。 您應該進行ObservationStatePair
並實現INotifyPropertyChanged
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.