같이 쉬운 일을 시도 할 때 문제가 있습니다. DependencyProperty
또는 DataTrigger
을 기반으로 Trigger
을 사용하려고했으나 작동하지 않습니다.WPF - 트리거가 실행되지 않음
<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>
및 관련 코드 숨김입니다 : 트리거에 대한
XAML은
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);
}
}
기본적으로 DP가 발표자로 올바르게 설정되고 (이것은 찾고 FileSystemWatcher
클래스를 기반으로 하나 이상의 파일에 대해) Trigger
이 (가) 발생하지 않습니다. 이 문제가 스레딩입니까?
감사합니다.
내 속성에 표준 getter/setter가있는 경우 예외가 발생합니다. "다른 스레드가이 개체를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다." I. 스레드 안전 getter/setter 사용해야합니다. 메인은 트리거를 통해 스타일을 지정하려는 버튼이있는 창입니다. 나는 문법적으로는 정확하지만 아무 것도하지 않는 것으로 보이는 다음 DataTrigger를 시도했다. P.s. 버튼에 Main 속성이 없으므로 XmlFilesAvailable을 트리거하려고합니다. –
pFrenchie
DataTrigger는 구문 상 올바르지 만 로컬 데이터 컨텍스트에서 XmlFilesAvailableForLoading 속성을 찾습니다. 그 맞습니까? 코드 샘플에서이 속성이 Main에있는 것처럼 보입니다. 그렇다면 ElementName을 샘플 바인딩 또는 RelativeSource AncestorType에 표시된대로 사용하여 DataTrigger 바인딩이 올바른 위치 (Main 요소)에서 속성을 찾도록 할 수 있습니다. – itowlson
다시 강조하면 Main은 컨트롤이 호스팅되는 Window이며 XmlFilesAvailableForLoading은 윈도우의 공용 속성이므로 로컬 데이터 컨텍스트 여야합니다. 샘플 코드에 표시된대로 ElementName을 추가했지만 사용하지 못했습니다 (즉, 컴파일되고 실행되지만 아무 일도 일어나지 않습니다). – pFrenchie