如何解决由ObservableCollection更新的GridView中的闪烁单元格
我有一个:
<controls:DataGrid>
在C#中进行的UWP开发中的XAML页面中,该信息会更新Web服务的价格。
通过ObservableCollection,单元格会自动更新价格。
我希望该单元格在值更新时闪烁。
我不知道如何通过ObservableCollection元素获取GridView的最新更新单元,以及以编程方式对其进行更新时引发的哪个事件。
XAML部分:
<controls:DataGrid x:Name="dgBalances" Height="600" Margin="12" AutoGenerateColumns="True" ItemsSource="{x:Bind Info.Balances }" Grid.Row="4" Grid.Column="0" AlternatingRowBackground="SlateGray" RowBackground="DimGray"/>
功能部分:
private async Task UpdateBalancesServiceAsync(ObservableCollection<AssetBalance> balances,MyWebservice client)
{
//Run like service updating the observablecollection
while (true)
{
// Get All Balances
var ret = await client.GetBalancesAsync();
if (ret.Success)
{
foreach (var returnedbalance in ret.Data)
{
if (balances.FirstOrDefault(x => x.Currency.Equals(returnedbalance.Currency)) != null)
{
// If Balance exists and the Value needs update.
if (balances.FirstOrDefault(x => x.Currency.Equals(returnedbalance.Currency)).Value != returnedbalance.Total)
{
_ = CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
balances.FirstOrDefault(x => x.Currency.Equals(returnedbalance.Currency)).Value = returnedbalance.Total;
balances.FirstOrDefault(x => x.Currency.Equals(returnedbalance.Currency)).LastUpdate = DateTime.Now;
});
}
else
{
// If Balance exists and the Value doesn't need update,just show the time last checked.
_ = CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
balances.FirstOrDefault(x => x.Currency.Equals(returnedbalance.Currency)).LastUpdate = DateTime.Now;
});
}
}
else
{
// If Balance does not exists it will create the new one.
_ = CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
balances.Add(new AssetBalance()
{
LastUpdate = DateTime.Now,Currency = returnedbalance.Currency,Value = returnedbalance.Total
});
});
}
}
}
Thread.Sleep(10000);
}
}
解决方法
您可以尝试通过指定用于显示的单元格模板来自定义单元格以创建自己的列类型,然后声明要与要闪烁的列绑定的Background color属性。例如,我创建一个“货币”列,并在余额增加时更改其“背景”。
.xaml:
<controls:DataGrid Height="600" Margin="12" AutoGenerateColumns="False" ItemsSource="{x:Bind Balances,Mode=OneWay}" Grid.Row="4" Grid.Column="0" AlternatingRowBackground="SlateGray" RowBackground="DimGray">
<controls:DataGrid.Columns>
<!--Currency Column-->
<controls:DataGridTemplateColumn Header="Currency">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Background="{Binding CellBackground}" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding Currency}"/>
</StackPanel>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
......
</controls:DataGrid.Columns>
</controls:DataGrid>
.cs:
public class AssetBalance : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
......
public SolidColorBrush cellBackground { get; set; }
public SolidColorBrush CellBackground
{
get { return cellBackground; }
set
{
cellBackground = value;
this.OnPropertyChanged();
}
}
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
}
}
///如果平衡增加,请更改背景
AssetBalance blance = Balances[index];
blance.CellBackground = new SolidColorBrush(Colors.Red);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。