如何解决wpf-当属性更改而与新值无关时触发datatrigger
|| 当数据网格单元格的值更改时,我正在尝试对数据网格中的单元格执行动画。 数据网格本身绑定到普通旧CLR对象的ObservableCollection。在这种情况下,可以说这些对象是具有'Firstname \',\'Lastname \'和\'Age \'属性的\'Person \'对象。 \'Person \'类实现INotifyPropertyChanged接口,并且每个属性在其setter中都有对onPropertyChanged的适当调用。 一切都很好。在datagrid定义中,我设置了用于绘制每个单元格的DataTemplate,并且还附加了一个datatrigger ...如下所示:<DataGridTemplateColumn Header=\"FirstName\">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Name=\"templateBorder\">
<TextBlock Name=\"templateTextBlock\" Text=\"{Binding Path=FirstName}\" />
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding=\"{Binding Path=FirstName}\" Value=\"Richard\">
<DataTrigger.Enteractions>
<BeginStoryboard>
<Storyboard AutoReverse=\"True\">
<DoubleAnimation Storyboard.TargetName=\"templateTextBlock\" Storyboard.TargetProperty=\"Opacity\" To=\".1\" Duration=\"0:0:.5\" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.Enteractions>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
当我的ObservableCollection中的对象被更新(我更改了FirstName值)时,数据网格也将被更新。按照上面的示例,如果我将FirstName的值更改为\'Richard \',那么动画也会执行得很好。
我的问题是,无论Firstname的新值是多少,我都需要运行动画。我已经爬网了,但似乎只有一些地方找不到针对已知值触发触发器的示例,例如如我在示例中所演示的,当FirstName为\'Richard \'时触发触发器。
我的问题是,无论更新属性的值如何,我如何触发数据触发器?因此,基本上,每当为数据网格中的给定行更新FirstName属性时,如何触发datatrigger。
非常感谢。
解决方法
由于从对该问题的回答中获得了指针,我发现答案是使用EventTrigger和TargetUpdated RoutedEvent。
<DataTemplate>
<Border Name=\"templateBorder\">
<TextBlock Name=\"templateTextBlock\" Text=\"{Binding Path=FirstName,NotifyOnTargetUpdated=True}\" />
</Border>
<DataTemplate.Triggers>
<EventTrigger RoutedEvent=\"Binding.TargetUpdated\">
<BeginStoryboard>
<Storyboard AutoReverse=\"True\">
<DoubleAnimation Storyboard.TargetName=\"templateTextBlock\" Storyboard.TargetProperty=\"Opacity\" To=\".1\" Duration=\"0:0:.5\" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataTemplate.Triggers>
</DataTemplate>
除EventTrigger之外,唯一需要做的另一件事就是在设置文本块的绑定时设置\'NotifyOnTargetUpdated = True \'。
谢谢。
, 看来您需要一个EventTrigger \“发生事件时执行X \”,而不是DataTrigger。
我自己没有尝试过..但是应该有可能引发您的自定义事件FirstNameChanged并执行触发操作来对此进行响应。
, <Storyboard x:Key=\"MessageStoryBoardEntry\" FillBehavior=\"Stop\">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)\">
<EasingDoubleKeyFrame KeyTime=\"0:0:00.30\" Value=\"0\"/>
<EasingDoubleKeyFrame KeyTime=\"0:0:03\" Value=\"0\"/>
<EasingDoubleKeyFrame KeyTime=\"0:0:03.20\" Value=\"1500\"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key=\"MessageStoryBoardExit\" FillBehavior=\"Stop\">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)\">
<EasingDoubleKeyFrame KeyTime=\"0:0:0.001\" Value=\"1500\"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
, 您可以尝试将TextBlock的DataContext设置为FirstName属性,然后使用DataContextChanged事件。
或者,您可以使用PropertyChanged事件并过滤所需的属性。
无论哪种方式,我认为您都必须使用一个事件。
, 您可以使用价值转换器破解某些东西吗?
<DataTrigger Binding=\"{Binding Path=FirstName,Converter=FirstNameConverter}\" Value=\"MakeItSo\">
和
class FirstNameConverter : IValueConverter
{
public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
{
return \"MakeItSo\";
}
public object ConvertBack(object value,CultureInfo culture)
{
...
}
}
我想这取决于WPF是否在每次属性更改时都调用转换器,还是首先评估该值。我没有尝试过,只是一个想法...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。