gpt4 book ai didi

Silverlight DataTrigger 未在加载时触发

转载 作者:行者123 更新时间:2023-12-04 10:56:53 25 4
gpt4 key购买 nike

我正在尝试将我的一些 WPF 技能转换为 Silverlight,并且在我一直在开发的测试迷你应用程序中遇到了一个稍微奇怪的问题。在 WPF 中,我习惯于在样式中使用 DataTriggers 来根据绑定(bind)数据的属性设置控件属性。我发现一些与 Blend 相关的程序集允许您在 Silverlight 中执行类似的操作,我想出了类似的方法,其中声明了以下命名空间:

xmlns:ia="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"  
xmlns:iv="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"


<DataTemplate x:Key="testItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name, Mode=TwoWay}" x:Name="thing"/>
<iv:Interaction.Triggers>
<ia:DataTrigger Binding="{Binding Name}" Value="ReddenMe" Comparison="Equal">
<ia:ChangePropertyAction TargetName="thing" PropertyName="Foreground" Value="Red">
</ia:ChangePropertyAction>
</ia:DataTrigger>
</iv:Interaction.Triggers>
</StackPanel>
</DataTemplate>

在此示例中,我有一个数据对象实现 INotifyPropertyChanged 并像往常一样为 Name 属性引发 PropertyChanged 事件。如果我更改文本框的值并失去焦点,我会得到预期的行为,但如果文本框的初始值设置为 ReddenMe(对于这个人为的示例,我将其用作文本变为红色的触发器),文字不会变红。有人知道这里发生了什么吗?对于 WPF 中的 DataTriggers,触发器将立即为任何数据触发。

我意识到我可以在这里使用转换器,但我可以想到我想使用触发器的情况,我想知道是否有什么我可以做的事情来完成这项工作。

最佳答案

这里是 a solution我在 Tom Peplow 的博客上找到:从 DataTrigger 继承,并让触发器在加载其关联元素时评估条件。

以下是如何编码:

public class DataTriggerEvaluateOnLoad : Microsoft.Expression.Interactivity.Core.DataTrigger
{
protected override void OnAttached()
{
base.OnAttached();
var element = AssociatedObject as FrameworkElement;
if (element != null)
{
element.Loaded += OnElementLoaded;
}
}

protected override void OnDetaching()
{
base.OnDetaching();
var element = AssociatedObject as FrameworkElement;
if (element != null)
{
element.Loaded -= OnElementLoaded;
}
}

private void OnElementLoaded(object sender, RoutedEventArgs e)
{
EvaluateBindingChange(null);
}
}

关于Silverlight DataTrigger 未在加载时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6508098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com