【问题标题】:Listview doesn't update when the ObservableCollection its bound to changes当 ObservableCollection 绑定到更改时,Listview 不会更新
【发布时间】: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 问题已编辑

标签: c# wpf


【解决方案1】:

使用您的模型 CycleTimer 实现 INotifyPropertyChanged 接口以使更改受到影响。

“Mark W”已经对此发表了评论。

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

ObservableCollection 类

表示一个动态数据集合,在添加、删除项目或刷新整个列表时提供通知。

所以当你更改模型属性时它不会通知。

【讨论】:

  • 是的......这就是我所指的。我没有使用该链接中引用的语法(仍在 .Net 4.0 上)实现它,但这是让通知工作的方法。感谢您的跟进,阿宾。
  • @MarkW 乐于助人。
  • 我认为不需要实施。这应该由 ListView 处理。
  • @iheanyi 如果它由 ListView 处理,为什么它不更新?如果您确定,请提供一个有效的示例。
  • @AbinMathew 查看我评论中的链接。
【解决方案2】:

我有一个 ObservableCollection 对象作为子属性..它和你抱怨的一样..即使实现 INotifyPropertyChanged>>

就这样解决了:

Obj.ObsCol = new ObservableCollection<Obj.ObsCol>

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2014-11-02
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2011-10-25
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多