Silverlight DataTrigger 未在加载时触发

标签 silverlight datatrigger

我正在尝试将我的一些 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/

相关文章:

silverlight - WP7 SL - 如何在一个 View 中使用两个不同的 View 模型。一个 VM : Display, 其他用于用户输入并对其进行操作

silverlight - 为什么我的 Silverlight UIElements 没有 OnPreview 事件?

silverlight - 当MVVM内置的riaservices功能中断时,为什么要使用MVVM

.net - 如何将 DataTrigger 与 ScrollViewer 是否可以向上滚动联系起来?

wpf - 在 WPF 中使用自定义依赖属性作为 DataTrigger

wpf - 使用数据触发器为线性画笔设置动画

c# - Silverlight 处理多个按键组合

c# - 数据绑定(bind)到 ComboBox 中的 CollectionViewSource 时如何保留 CurrentItem 的双向绑定(bind)

wpf - 如何在属性上触发 Storyboard

wpf - 比较 DataTrigger 中的两个动态值