[英]ListView bound to ObservableCollection<T> Doesn't update when Added to property
[英]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.