WPF - 触发不触发

时间:2009-10-29 03:35:22

标签: c# wpf triggers

我在尝试做一些应该如此简单的事情时遇到问题。我尝试使用基于TriggerDependencyProperty的{​​{1}} - 我无法工作。

触发器的XAML是:

DataTrigger

相关的代码隐藏是:

<Style x:Key="FileWatchButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="Main:Main.XmlFilesAvailableForLoading" Value="True">
            <Setter Property="Background" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

基本上,演示者正在正确设置dp(它基于查找一个或多个文件的public static readonly DependencyProperty XmlFilesAvailableForLoadingProperty = DependencyProperty.Register("XmlFilesAvailableForLoading", typeof(bool), typeof(Main)); public bool XmlFilesAvailableForLoading { get { try { return (bool)this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind, (System.Windows.Threading.DispatcherOperationCallback)delegate { return GetValue(XmlFilesAvailableForLoadingProperty); }, XmlFilesAvailableForLoadingProperty); } catch (Exception) { return (bool)XmlFilesAvailableForLoadingProperty.DefaultMetadata.DefaultValue; } } set { this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.DataBind, (System.Threading.SendOrPostCallback)delegate{ SetValue(XmlFilesAvailableForLoadingProperty, value); }, value); } } 类),但FileSystemWatcher未被触发。这是一个线程问题吗?

感谢。

1 个答案:

答案 0 :(得分:1)

目前尚不清楚代码是否完整,但看起来触发器中的Property路径可能是错误的。被设计样式的按钮是否具有Main属性?我猜不是;看起来你试图触发一个名为Main的不同元素的属性 - 是吗?

在任何情况下,都不需要名称空间前缀。如果按钮具有名为Main的属性,则可以直接解决此问题;如果没有,那么前缀对你没有帮助。

我猜你可能需要一个DataTrigger,其绑定引用Main元素:

<local:Main Name="MyMain" ... />  <!-- this has the XmlFilesAvailableForLoading property -->

<DataTrigger Binding="{Binding XmlFilesAvailableForLoading, ElementName=MyMain}"
             Value=True>
  <Setter Property="Background" Value="Red" />
</DataTrigger>

在不相关的说明中,您应该在DP getter和setter中使用任何非样板实现。请记住,绑定和样式系统将绕过getter和setter并直接与底层存储对话。所以我强烈建议将这些更改回普通的GetValue和SetValue调用。