ListView中的WPF按钮未触发

时间:2013-09-16 05:51:52

标签: c# wpf

我对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,一个单独的线程每200ms更新一次其他列。现在,当我单击上面定义的按钮时,似乎没有发生任何事情(就像我没有点击按钮一样),但是如果我增加另一个线程的休眠时间(即2000ms),则后面的代码会正确处理事件。

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

以下是更新集合的代码

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);
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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