我在尝试做一些应该如此简单的事情时遇到问题。我尝试使用基于Trigger
或DependencyProperty
的{{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
未被触发。这是一个线程问题吗?
感谢。
答案 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调用。