Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加时C#WPF listView未实时更新_C#_Wpf_Listview_Binding - Fatal编程技术网

添加时C#WPF listView未实时更新

添加时C#WPF listView未实时更新,c#,wpf,listview,binding,C#,Wpf,Listview,Binding,我将listView绑定到一个类: <ListView x:Name="lvInfo" HorizontalAlignment="Left" Height="277" Margin="23,63,0,0" VerticalAlignment="Top" Width="750"> <ListView.View> <GridView> <GridViewColumn Header="#

我将listView绑定到一个类:

 <ListView x:Name="lvInfo" HorizontalAlignment="Left" Height="277" Margin="23,63,0,0" VerticalAlignment="Top" Width="750">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="#" Width="20" DisplayMemberBinding="{Binding execNumber}"/>
                <GridViewColumn Header="Function" Width="120" DisplayMemberBinding="{Binding currentFunction}"/>
                <GridViewColumn Header="Message" Width="300"  DisplayMemberBinding="{Binding pcdMessage}"/>
                <GridViewColumn Header="Event Type" Width="75" DisplayMemberBinding="{Binding pcdEventType}"/>
                <GridViewColumn Header="Event" Width="150" DisplayMemberBinding="{Binding pcdEvent}"/>
                <GridViewColumn Header="Timing" Width="50" DisplayMemberBinding="{Binding strTime}"/>
            </GridView>
        </ListView.View>
    </ListView>
该类通过事件更新:

private void MyPcd_OnStatusChange(string _currentFunction, string _PCDMessage, Helper.ePcdEventType _pcdEventType, Helper.ePcdEvent _pcdEvent)
    {
        String strTime;
        if (lastTime == default(DateTime))       
            strTime = "---";
        else
        {
            TimeSpan ts = DateTime.Now - lastTime;
            strTime = ts.TotalSeconds.ToString("0.000")+ "\"";
        }
        lastTime = DateTime.Now;

        PcdStatus newStatus = new PcdStatus(execNumber, _currentFunction, _PCDMessage, _pcdEventType, _pcdEvent, strTime);
        Application.Current.Dispatcher.BeginInvoke(new Action(() => this.ocList.Add(newStatus)));
        //ocList.Add(newStatus);           
    }
类更新已正确完成,但不是实时更新。我添加了一个console.Beep(),它在库中触发事件时向我发出警告。因此,库中的事件-->My_PcdOnStatusChange-->ocList.Add-->listView已更新。 我希望每次哔哔声都有更新,但listView只在所有s/r结束时更新

编辑很抱歉忘记提及以下ocList代表:

 ObservableCollection<PcdStatus> ocList = new ObservableCollection<PcdStatus>();
预期的行为是:

idle --> green
started ---> red
terminated ---> green
idle ---> green
started --->green
midway ---> red
terminated --->green.
虽然其行为是:

idle --> green
started ---> red
terminated ---> green
idle ---> green
started --->green
midway ---> red
terminated --->green.
我是winforms中WPF的新手,有一个Mainform.Update。这里有类似的东西吗

谢谢你的帮助
Patrick

您需要将ItemSource属性绑定到实现

其中最简单的是


如果希望更新属性更改,则还应实现PcdStatus

调度程序不保证何时调用您的操作。此外,您甚至没有指定一个。尝试将优先级设置为
Send
,看看是否有帮助。仅供参考,它永远不会是完美的,因为消息循环永远不能以任何接近“实时”的方式处理UI事件。ocList可能是一个可观察的集合,但您的代码没有显示任何与它的绑定,您在哪里设置ListView。ItemSource={binding ocList}?
BeginInvoke
是异步的。对同步调度程序调用使用
Invoke
。@Clemens请查看我的编辑2我使用Invoke,但这并没有“改变”。@MikeT抱歉我的错,我有它lvInfo.ItemsSource=ocList;但是请看我的编辑2