2010-01-22 7 views
3

다음 DependencyProperty 있습니다 :wpf - 업데이트 된 종속성 속성이 바인딩을 시작하지 않음

public bool IterationSelected 
{ 
    get { return (bool)GetValue(IterationSelectedProperty); } 
    set { SetValue(IterationSelectedProperty, value); } 
} 
public static readonly DependencyProperty IterationSelectedProperty = 
    DependencyProperty.Register("IterationSelected", typeof(bool), 
    typeof(MainMediator), new UIPropertyMetadata(false)); 

(이것은 VS 템플릿에서 생성 된)

다음 DataTrigger 업데이트 할 :

<Grid.Style> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Value="True"> 
       <DataTrigger.Binding> 
        <MultiBinding Converter="{StaticResource IsOpenFalseAndIsCheckedTrueMultiConverter}"> 
         <Binding ElementName="popSelectIteration" Path="IsOpen"/> 
         <Binding ElementName="chkIteration" Path="IsChecked"/> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="loc:MainMediator.IterationSelected" Value="True"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Grid.Style> 

마지막으로,이 Grid 속성에 따라 가시성이 달라집니다.

<Grid Visibility="{Binding IterationSelected, Converter={StaticResource BooleanToVisibilityConverter}, diagnostics:PresentationTraceSources.TraceLevel=High}" Grid.Row="1"> 
    <TextBlock>Testing 1323</TextBlock> 
</Grid> 
DataTrigger

그래서 여기에 문제가 있습니다. diagnostics:PresentationTraceSources.TraceLevel="High"를 사용하여 모든 바인딩을 테스트하면 loc:MainMediator:IterationSelected이 true로 설정되면 Grid가 픽업되지 않습니다. 아무것도 발생하지 않습니다. 그것은 구속력이 없거나 그와 같은 것이 아닙니다. 그냥 시도조차하지 않습니다. Grid 바인딩이 실행되는 유일한 시간은 앱 시작 시점입니다. 그 시간에 정확하게 발사되고 평가됩니다.

IterationSelected을 일반 종속성 속성 대신 첨부 된 속성으로 만들려고 시도한 유일한 방법은 (및 실패했습니다). 그러나 그 역시 실패했습니다.

WPF 전문가, 아이디어가 있습니까?

답변

2

말하기가 약간 어렵지만 바인딩 소스가 잘못되어있는 것처럼 보입니다. 또한 속성 참조에 대해 약간의 모호성이있는 것으로 보이지만 이는 첨부 된 속성 실험의 인공물 일 수 있습니다.

기본적으로 Grid.Visibility 바인딩은 현재 DataContext에서 IterationSelected 속성을 찾고 있습니다. 그러나 귀하의 스타일 DataTriggerloc:MainMediator으로 설정되어 있습니다. Grid의 IterationSelected 속성입니다.

이 수정 프로그램은 Grid.Visibility 바인딩이 loc:MainMediator을 찾는 것입니다. IterationSelected 속성은 Grid 자체에 있습니다 (DataContext 대신). 이렇게하려면 바인딩 선언에 RelativeSource={RelativeSource Self}를 추가 : 이것은 오히려 DataContext에서보다에 바인딩 된 요소를보고 바인딩을 알려줍니다

Visibility="{Binding IterationSelected, 
        Converter={StaticResource BooleanToVisibilityConverter}, 
        RelativeSource={RelativeSource Self}}"> 

.

경로를 IterationSelected이 아닌 loc:MainMediator.IterationSelected으로 변경해야 할 수도 있습니다.

마지막으로, IterationSelected 속성이 다른 작업을 수행 여부에 따라 다른 방법은 세터 직접 가시성을 설정하도록 그냥 :

<DataTrigger Value="True"> 
    <!-- binding omitted --> 
    <Setter Property="Visibility" Value="Visible" /> 
</DataTrigger> 
1

샘플의 세터가 IterationSelected을 설정하기 위해 노력하고있다 속성은 그리드에 있지만, DP는 MainMediator 유형이 소유합니다. MainMediator에 값을 설정하려는 경우 그리드와 관련하여 어디입니까? 대신 실제로이 스타일을 MainMediator 컨트롤에 적용하고 싶지만이 코드에서 알 수는없는 것 같습니다. AP를 시도한 것을 언급 했으므로 IterationSelected을 그리드에 설정할 수 있습니다.

당신이 어떤 일을하려고하는지 더 자세히 알 수 있습니까?

관련 문제