簡體   English   中英

當ObservableCollection綁定更改時,Listview不會更新

[英]Listview doesn't update when the ObservableCollection its bound to changes

我是WPF的新手,並且ListView遇到了一些麻煩。 我創建了一個列表視圖,以可視方式向用戶顯示Observable集合中的數據。 唯一的問題是,當ObservableCollection中的值更改時,ListView不會更新。 但是,如果添加或刪除了元素,則顯示正確。 關閉並重新打開窗口也會使它顯示正確的數據。

列表視圖窗口的xaml是

<Grid>
    <ListView Name="RunningCycleListView" HorizontalAlignment="Left" Height="266" VerticalAlignment="Top" Width="546" ItemsSource="{Binding RunningCycles, BindsDirectlyToSource=True}">
        <ListView.Resources>
            <Style TargetType="{x:Type ListViewItem}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding OverCycleLogged}" Value="true">
                        <Setter Property="Background" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListView.Resources>
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Name}">
                    <GridViewColumnHeader Width="100">
                        <TextBlock Text="Cycle Name"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding AGV.AgvGroup}">
                    <GridViewColumnHeader Width="67">
                        <TextBlock Text="Group"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding AGV.Type}">
                    <GridViewColumnHeader Width="67">
                        <TextBlock Text="Type"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding AGV.AgvID_Number}" Width="90">
                    <GridViewColumnHeader Width="90">
                        <TextBlock Text="ID"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding StartTime}" Width="140">
                    <GridViewColumnHeader Width="140">
                        <TextBlock Text="Start Time"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding MaxTime}">
                    <GridViewColumnHeader Width="75">
                        <TextBlock Text="Max Time"/>
                    </GridViewColumnHeader>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

與之關聯的C#很簡單

    public partial class CycleViewerWindow : Window
{
    public CycleViewerVM viewModel;

    public CycleViewerWindow(ObservableCollection<CycleTimer> runningCycles)
    {
        this.viewModel = new CycleViewerVM(runningCycles);
        InitializeComponent();
        this.DataContext = viewModel;
        this.Closing += CycleViewerWindow_Closing;
    }

    void CycleViewerWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        this.Closing -= CycleViewerWindow_Closing;
    }

最后是視圖模型

public class CycleViewerVM
{
    public CycleViewerVM(ObservableCollection<CycleTimer> runningCycles)
    {
        this.RunningCycles = runningCycles;
    }
    private ObservableCollection<CycleTimer> runningCycles;
    public ObservableCollection<CycleTimer> RunningCycles
    {
        get { return runningCycles; }
        set { this.runningCycles = value; }
    }
}

我相信ListView正確地綁定到ObservableCollection,但是似乎找不到錯誤或合適的解決方法。

CycleTimer類:

public class CycleTimer
{
    #region Constructor(s)

    public CycleTimer(string cycleTimerName, int CycleTimerStartRfid, int CycleTimerStopRfid, int CycleTimerMaxCount, AGVData agv = null)
    {
        this.name = cycleTimerName;
        this.cycleStartRfid = CycleTimerStartRfid;
        this.cycleStopRfid = CycleTimerStopRfid;
        this.maxTime = CycleTimerMaxCount;
        this.agv = agv;
        this.startTime = DateTime.Now;
    }

    #endregion Constructor(s)

    #region Fields and Properties

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private DateTime startTime;
    public DateTime StartTime
    {
        get { return startTime; }
        protected set { startTime = value; }
    }

    private int maxTime;
    public int MaxTime
    {
        get { return maxTime; }
        set { maxTime = value; }
    }
    private AGVData agv;
    public AGVData AGV
    {
        get { return agv; }
    }


    private Boolean overCycleLogged;
    public Boolean OverCycleLogged
    {
        get { return this.overCycleLogged; }
        set { this.overCycleLogged = value; }
    }
    #endregion Fields and Properties

    #region Methods

    public Boolean isOverCycle()
    {
        DateTime maximumTime = this.startTime.AddSeconds(this.maxTime);
        if (DateTime.Now > maximumTime)
        {
            return true;
        }
        return false;
    }
    #endregion Methods

暗示INotifyPropertyChanged與模型CycleTimer的接口,以使更改受到影響。

“ Mark W”已經對此發表了評論。

https://stackoverflow.com/a/1316417/2470362

ObservableCollection類

表示一個動態數據集合,當添加,刪除或刷新整個列表時提供通知。

因此,當您更改模型屬性時,它不會通知。

我有一個對象的ObservableCollection作為子屬性..即使您實現INotifyPropertyChanged >>,它的作用也與您抱怨的一樣。

解決了這個問題:

Obj.ObsCol = new ObservableCollection<Obj.ObsCol>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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