【发布时间】:2015-07-24 17:04:04
【问题描述】:
我是 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
【问题讨论】:
-
ObservableCollection 将显示对集合的更改(添加/删除)。通过在项目类 (CycleTimer) 上实现 INotifyPropertyChanged 来控制对集合中项目属性的更改 - 如果您共享该类代码,我可以提供进一步的帮助。
-
试试 this.DataContext = viewModel.RunningCycles;
-
设置 ListView 的 ItemsSource。见stackoverflow.com/questions/10659347/…
-
@iheanyi 这不是我在 xaml 的第二行中所做的吗?
-
@MarkW 问题已编辑