我对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);
}
}
}
答案 0 :(得分:1)
我认为问题是刷新清单。更新速度比您单击更快。您不应该清除列表,而是同步它。
答案 1 :(得分:1)
单击按钮包括鼠标按下然后鼠标按下活动。当鼠标位于同一个按钮实例上方时,两个活动都应该完成。 当您快速刷新GridView中的项目时,您的鼠标按下活动发生在一个按钮实例上,然后刷新列表并且鼠标下的按钮实例被其他按钮实例替换,因此在其他按钮实例上完成鼠标按下活动。
就像在鼠标按下一个按钮时按下鼠标按钮一样,然后将鼠标移动到其他按钮,然后释放鼠标按钮。不会触发点击事件。
您可以将click事件更改为鼠标按下或鼠标按下事件并确保触发,但我不确定从设计的角度来看它是否是正确的解决方案。如果您需要设计建议,您应该提供更多信息。