【问题标题】:DataTrigger from interaction not working Windows Phone来自交互的 DataTrigger 无法正常工作 Windows Phone
【发布时间】:2014-10-31 04:33:26
【问题描述】:

我有一个简单的示例,但使用 TemplatedParent 的数据绑定不起作用。有谁知道出了什么问题?

  <Button Background="Red" Content="xD">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Border>
                    <i:Interaction.Triggers>
                        <ec:DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Background}" Value="Red">
                            <ec:ChangePropertyAction PropertyName="Background" Value="CadetBlue"/>
                        </ec:DataTrigger>
                    </i:Interaction.Triggers>
                </Border>
            </ControlTemplate>
        </Button.Template>
    </Button>

输出没有错误。背景应该设置为 CadetBlue,但没有应用任何效果。

【问题讨论】:

  • 您能否更详细地说明它是如何不起作用的? 输出窗口中是否有任何异常或通知错误?
  • 我认为TemplatedParent模式只能用于ControlTemplate,在这种情况下它用于Border
  • 它不能正常工作。

标签: xaml silverlight windows-phone interaction


【解决方案1】:

似乎RelativeSource.TemplatedParent 在模板中工作正常,但触发器无法按预期工作:如果触发器条件最初匹配,则触发器/操作不会触发。如果您以编程方式更改绑定属性,触发器触发。这就是它与IsPressed 一起使用的原因:按钮开始时没有按下;加载后被按下。

如果您将触发器移出模板并将它们直接附加到按钮并相应地调整绑定,那么一切都应该正常工作:

<Button x:Name="_button"
        Background="Red"
        Content="xD">
  <i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding ElementName=_button, Path=Background.Color}"
                    Value="Red">
      <ei:ChangePropertyAction PropertyName="Background"
                               Value="CadetBlue" />
    </ei:DataTrigger>
  </i:Interaction.Triggers>
  <Button.Template>
    <ControlTemplate TargetType="Button">
      <Border Background="{TemplateBinding Background}">
        <ContentPresenter />
      </Border>
    </ControlTemplate>
  </Button.Template>
</Button>

注意后台触发器必须绑定到Background.Color;如果绑定到画笔本身,它就不起作用,可能是因为SolidColorBrush 没有覆盖Equals

【讨论】:

  • 这对我有什么帮助?它没有任何效果。似乎 DataTrigger 无法访问 TemplatedParent,或者如果它无法更改元素,在本例中为边框。
  • 如果您不在模板中引用它,您将根本看不到背景。如果您无法解析TemplatedParent,则将i:Interaction.Triggers 直接移动到Button 下而不是模板中。
  • 我不想看到它,而是阅读它并根据它的价值做一些行动。我粘贴了简单的示例,但通常我想阅读例如 IsEnabled 属性并在模板中执行一些操作。主要担心的是我无法使用交互访问父模板。
  • IsPressed 有效,但尝试其他属性,如 Opacity、IsEnabled、AllowDrop 等,它们不起作用。
  • 感谢您的努力,但总而言之,它不允许我从父级获取一些信息并在此基础上执行一些操作,因此我最终使用转换器如下:Background="{Binding RelativeSource= {RelativeSource Mode=TemplatedParent},Path=Opacity,Converter={StaticResource MyConverter}}"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多