2009-10-29 6 views
1

같이 쉬운 일을 시도 할 때 문제가 있습니다. 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이 (가) 발생하지 않습니다. 이 문제가 스레딩입니까?

감사합니다.

답변

1

코드가 완전 한지는 확실하지 않지만 트리거의 속성 경로가 잘못되었을 수 있습니다. 스타일이 적용된 버튼에 Main 속성이 있습니까? 나는 추측하고있다. Main이라고하는 다른 요소의 속성에서 트리거하려고하는 것처럼 보입니다. 맞습니까?

어쨌든 네임 스페이스 접두사는 필요하지 않습니다. 버튼에 Main이라는 속성이 있으면 직접 처리 할 수 ​​있습니다. 그렇지 않으면 접두사가 도움이되지 않습니다. 당신이 당신의 DP 게터와 세터에 비 상용구 구현을해야

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

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

관련이없는 노트에 :

내 생각 엔 당신은 아마 그 바인딩 기본 요소를 참조하는 DataTrigger을 필요로한다는 것입니다. 바인딩 및 스타일 시스템은 getter 및 setter를 우회하여 기본 저장소와 직접 대화한다는 점을 기억하십시오. 그래서 나는 이것들을 단지 평범한 GetValue와 SetValue 호출로 변경하는 것을 강력히 권고한다.

+0

내 속성에 표준 getter/setter가있는 경우 예외가 발생합니다. "다른 스레드가이 개체를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다." I. 스레드 안전 getter/setter 사용해야합니다. 메인은 트리거를 통해 스타일을 지정하려는 버튼이있는 창입니다. 나는 문법적으로는 정확하지만 아무 것도하지 않는 것으로 보이는 다음 DataTrigger를 시도했다. P.s. 버튼에 Main 속성이 없으므로 XmlFilesAvailable을 트리거하려고합니다. – pFrenchie

+0

DataTrigger는 구문 상 올바르지 만 로컬 데이터 컨텍스트에서 XmlFilesAvailableForLoading 속성을 찾습니다. 그 맞습니까? 코드 샘플에서이 속성이 Main에있는 것처럼 보입니다. 그렇다면 ElementName을 샘플 바인딩 또는 RelativeSource AncestorType에 표시된대로 사용하여 DataTrigger 바인딩이 올바른 위치 (Main 요소)에서 속성을 찾도록 할 수 있습니다. – itowlson

+0

다시 강조하면 Main은 컨트롤이 호스팅되는 Window이며 XmlFilesAvailableForLoading은 윈도우의 공용 속성이므로 로컬 데이터 컨텍스트 여야합니다. 샘플 코드에 표시된대로 ElementName을 추가했지만 사용하지 못했습니다 (즉, 컴파일되고 실행되지만 아무 일도 일어나지 않습니다). – pFrenchie

관련 문제