[wpf] DataTemplate에서 부모 DataContext에 액세스


Answers

RelativeSource 를 사용하여 부모 요소를 찾을 수 있습니다 (예 :

Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
RelativeSource={RelativeSource AncestorType={x:Type local:YourParentElementType}}}"

RelativeSource 대한 자세한 내용은 이 SO 질문 을 참조하십시오.

Question

ViewModel의 하위 컬렉션에 바인딩하는 ListBox 가 있습니다. 목록 상자 항목은 상위 ViewModel의 속성을 기반으로하는 데이터 형식으로 스타일이 지정됩니다.

<Style x:Key="curveSpeedNonConstantParameterCell">
   <Style.Triggers>
      <DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
          ElementName=someParentElementWithReferenceToRootDataContext}" 
          Value="True">
          <Setter Property="Control.Visibility" Value="Hidden"></Setter>
      </DataTrigger>
   </Style.Triggers>
</Style>

다음 출력 오류가 발생합니다.

System.Windows.Data Error: 39 : BindingExpression path error: 
 'CurveSpeedMustBeSpecified' property not found on 
   'object' ''BindingListCollectionView' (HashCode=20467555)'. 
 BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified; 
 DataItem='Grid' (Name='nonConstantCurveParametersGrid');
 target element is 'TextBox' (Name=''); 
 target property is 'NoTarget' (type 'Object')

따라서 바인딩 식을 "Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified" 로 변경하면 부모 사용자 정의 컨트롤의 datacontext가 BindingListCollectionView 경우에만 작동합니다. 나머지 사용자 컨트롤은 BindingList 에있는 CurrentItem 의 속성에 자동으로 바인딩되기 때문에이 방법을 사용할 수 없습니다.

스타일 내에서 바인딩 표현식을 지정하여 컬렉션 뷰 또는 단일 항목 인 상위 데이터 컨텍스트와 상관없이 작동하도록하려면 어떻게해야합니까?




WPF에서 비슷한 작업을 수행하는 방법을 찾고 있었고이 솔루션을 얻었습니다.

<ItemsControl ItemsSource="{Binding MyItems,Mode=OneWay}">
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <RadioButton 
            Content="{Binding}" 
            Command="{Binding Path=DataContext.CustomCommand, 
                        RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType={x:Type ItemsControl}} }"
            CommandParameter="{Binding}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>

나는 이것이 다른 누군가를 위해 일하기를 바랍니다. ItemsControls에 자동으로 설정된 데이터 컨텍스트가 MyItems 데이터 컨텍스트에는 MyItems 컬렉션)와 'CustomCommand'라는 두 가지 속성이 있습니다. ItemTemplateDataTemplate 사용하기 때문에 상위 수준의 DataContext 에 직접 액세스 할 수 없습니다. 그런 다음 부모의 DC를 얻는 해결 방법은 ItemsControl 유형별로 상대 경로와 필터를 사용하는 것입니다.




Related