0

我对 WPF 专家有一个非常简单的问题。

我从 XAML 代码开始:

<ListView Name="ListViewRunner" ItemsSource="{Binding Path=CurrentPrices}" >
  <GridView>
     <!-- Many GridViewColumn that display values --> 

     <GridViewColumn Header="Chart" Width="70" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Name="btnDisplayChart" Content="Chart"
                                        Click="DisplayChart_Click"
                                        Tag="{Binding ID}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
       </GridViewColumn>
  </GridView>
</Listview>

CurrentPrices 是一个异步 ObservableCollection 并且一个单独的线程每 200 毫秒更新一次其他列。现在,当我单击上面定义的按钮时,似乎没有发生任何事情(就像我没有单击按钮一样),但是如果我增加另一个线程的睡眠时间(即 2000 毫秒),则后面的代码会正确处理事件。

你能指出我正确的方向吗?

这是更新集合的代码

private void getRemotePrices(){
            while(update)
            {
                lock (boccaciccio)
                {
                    MarketPrices marketprices = bf.GetMarketPrices(market.ID);
                    market.UpdateMarketPrices(marketprices);

                    lastPrices.Clear();
                    foreach (var runnerprice in market.ADATA)
                    {
                        lastPrices.Add(runnerprice);
                    }
                    notifyObservers(lastPrices); //updates every subscriber
                    Thread.Sleep(200);
                }
            }
        }
4

2 回答 2

1

我认为问题是刷新列表。更新速度比您单击的要快。您不应该清除列表,而是同步它。

于 2013-09-16T06:19:08.940 回答
1

单击按钮包括鼠标按下然后鼠标向上活动。当鼠标在同一个按钮实例上方时,这两个活动都应该完成。当您刷新 GridView 中的项目过快时,您的鼠标按下活动发生在一个按钮实例上,然后列表刷新并且鼠标下的按钮实例被其他按钮实例替换,因此鼠标向上活动在其他按钮实例上完成。

就像在鼠标在一个按钮上时按下鼠标按钮,然后将鼠标移动到另一个按钮,然后释放鼠标按钮一样。不会触发任何点击事件。

您可以将点击事件更改为鼠标按下或鼠标按下事件并确保触发,但我不确定从设计的角度来看这是否是正确的解决方案。如果您需要设计建议,您应该提供更多信息。

于 2013-09-16T06:39:31.307 回答