我有一个绑定到ObservableCollection的数据网格,我想要做的是当它们被添加到数据网格时(即当一个新对象插入到ObservableCollection中时)突出显示新行.我想通过最初更改背景颜色来突出显示行,但随后随着时间的推移使颜色渐渐恢复正常.我已经尝试了各种不同的方法来使它工作,但没有什么工作正常.
方法1:我有一个事件触发器,当列加载时触发.当元素加载时它会触发,但它似乎几乎随机地在其他旧行上触发(当行是新行时它已经触发过的行).
<DataGridHyperlinkColumn x:Name="OrderID" Binding="{Binding OrderNumber}" Header="Order" SortMemberPath="ciOrderId">
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="Transparent"/>
<EventSetter Event="Hyperlink.Click" Handler="OrderNumber_Click" />
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"
Duration="00:00:03"
From="Red" To="Transparent" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
Run Code Online (Sandbox Code Playgroud)
方法2:我在视图模型中创建了一个bool,当新项添加到ObservableCollection时,该模型被设置为true.然后我在触发器中检查这个值,如果是真的,我会触发故事板.我不能让它正常工作,并且当我运行它时应用程序会出错.此外,一旦故事板运行,我无法找到将此值设置为false的方法(我无法使用故事板的Completed事件,因为DataTrigger是一种样式).
<DataTrigger Binding="{Binding isNew}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"
Duration="00:00:03"
From="Red" To="{x:Null}" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
方法3:我尝试在将新项添加到可观察集合时在视图模型中设置时间戳字段.然后在XAML中我希望能够将该时间戳与当前时间进行比较,如果匹配则我将触发该事件.我甚至有另一个包含当前时间的字段,并由INotifyPropertyChanged自动更新,但我似乎无法找到一种方法来比较新行的时间戳与包含当前时间的字段.
我觉得必须有一个解决方案,但在度过了令人沮丧的一天后,我想要解决这个问题,我希望有人能够解决这个问题.
假设您有一个带有属性的对象和一个绑定到该对象属性的控件.当该对象被更改时会发生什么?
例如,ViewModel:
public class TheViewModel : INotifyPropertyChanged
{
private TheObjectClass theObject;
public TheObjectClass TheObject
{
get { return theObject; }
set { theObject = value;
OnPropertyChanged("TheObject"); }
}
}
Run Code Online (Sandbox Code Playgroud)
对象的类:
public class TheObjectClass : INotifyPropertyChanged
{
private ThePropertyClass theProperty;
public ThePropertyClass TheProperty
{
get { return theProperty; }
set { theProperty= value;
OnPropertyChanged("TheProperty"); }
}
}
Run Code Online (Sandbox Code Playgroud)
酒店的课程:
public class ThePropertyClass : INotifyPropertyChanged
{
private object objectToBindTo;
public object ObjectToBindTo
{
get { return objectToBindTo; }
set { objectToBindTo= value;
OnPropertyChanged("ObjectToBindTo"); …Run Code Online (Sandbox Code Playgroud) 我DataGrid在 WPF 中注意到,当我设置时SelectionMode="Extended",水平滚动变得非常不完整/奇怪。某种“全选”类型的按钮会在网格的左上角快速出现/消失,并且标题和列在滚动时来回跳跃。滚动条本身也在滚动时来回跳跃。滚动做排序的工作,但行为而滚动真的是马车看。
我注意到如果我设置SelectionMode="Single"然后问题就会消失,但我想使用SelectionMode="Extended". 这是我的数据网格的代码:
<DataGrid x:Name="dataGrid" SelectionMode="Extended" SelectionUnit="Cell"
HeadersVisibility="Row,Column" RowHeaderWidth="0"
ItemsSource="{Binding ElementName=dataPager, Path=PageView}"
CanUserReorderColumns="False"
CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False">
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?提前致谢!
我有多个异步方法需要调用并等待它们全部完成。异步方法都有回调参数,这些参数会在异步处理完成时执行。所以我想我需要在每个回调中放置一些信号设备,然后在继续之前等待所有信号到来。
在做了一些搜索之后,我想我可以使用一个数组,AutoResetEvents然后调用WaitHandle.WaitAll来等待它们。就像是:
WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};
DoWorkA((callback) =>
{
waitHandles[0].Set();
});
DoWorkB((callback) =>
{
waitHandles[1].Set();
});
// wait for DoWorkA and DoWorkB to finish
WaitHandles.WaitAll(waitHandles);
// continue with the processing
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是一个好方法,或者是否有更好/更简单的方法。我需要 .Net 2.0 的解决方案,但我也很想知道更高版本的 .Net 还提供哪些其他解决方案。
编辑:
尝试此代码后,我发现它不起作用。UI 线程停止WaitHandles.WaitAll(waitHandles)并且回调永远不会运行......
在 DoWork 方法中,有代码在后台线程上不时运行,然后从该后台线程我尝试通过BeginInvoke从 UI 线程调用的控件来运行回调。但是,回调永远不会在 UI 线程上执行。任何想法我做错了什么?
编辑 2:
我意识到为什么它不起作用 - 线程调用WaitHandles.WaitAll(waitHandles)与回调试图在其上运行的线程(UI 线程)相同。所以当然,如果线程正在等待信号,回调将永远不会在同一个线程上运行,因此Set()永远不会被调用。WaitAll(waitHandles) 和 Set() 应该可以工作,只要它们不打算在同一线程上运行。我想我需要修复它,以便在 UI 线程等待时回调在后台线程上运行。如果我的想法不正确,请告诉我。
c# ×2
wpf ×2
wpfdatagrid ×2
.net-2.0 ×1
asynchronous ×1
data-binding ×1
scrollbar ×1
storyboard ×1
triggers ×1