簡體   English   中英

修改ListView的“ itemsSource”元素不會對其進行更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM