2011-03-23 4 views
2

DataTemplateDataContext을 리소스 내에서 바인딩에 사용할 수있는 방법이 있습니까?DataTemplate 내의 리소스에서 바인딩

<DataTemplate x:Key="History"> 
    <ItemsControl ItemsSource="{Binding History}"> 
    <ItemsControl.Resources> 
     <app:BitmapProvider x:Key="Converter" ShowDetails="True" 
          Type="{Binding Model.Type}" /> 
    </ItemsControl.Resources> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Image Source="{Binding Data, Converter={StaticResource Converter}}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 

상기 템플릿은 ListBoxCellTemplate로서 사용된다. 해당 레벨의 오브젝트에는 History ("historical info"오브젝트 목록 포함) 및 Model (Type을 비롯한 여러 가지 항목이 포함되어 있음)이라는 두 가지 특성이 있습니다. 서로 옆에 역사적인 항목을 표시하려면 ItemsControl을 사용하고 있습니다. 각 이미지를 표시하고 이미지는 IValueConverterBitmapProvider에서 가져옵니다.

결과를 얻으려면 변환기에 2 비트의 정보가 필요합니다. 하나는 개별 기록 항목의 Data이고 다른 하나는 전체 모음의 Type입니다. 추가 된 합병증은이 특정 변환기를 구성하는 것 (또는 그에 부여 된 Type을 변경하는 것이 비용이 많이 들기 때문에 개별 이력 항목의 수준에 넣거나 MultiBinding을 사용하지 않으려 고합니다. 템플리트 외부에두면 Type에 액세스 할 수 없으므로 템플리트 외부에 두십시오.

System.Windows.Data 오류 : 2 :

불행하게도, 위에서 나에게 다음과 같은 오류를 제공 대상 요소에 적용 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다. BindingExpression : Path = Model.Type; DataItem = null; 대상 요소는 'BitmapProvider'(HashCode = 57142809)입니다. 대상 속성은 'Type'(유형 'TypeDetails')입니다.

나는 리소스가 포함 된 요소의 DataContext을 얻는 방법을 알 수 없다는 것을 의미하는 것으로 이해합니다.

(검색 한 결과 대부분이 템플릿 외부로 이동하거나 MultiBinding을 사용하는 것이 좋습니다.이 경우 어느 쪽도 실제로 작동하지 않을 수 있습니다. 위의 설명을 참고하십시오. 그러나 나는 틀린 것으로 증명되거나 다른 대안이 주어진 것을 기뻐할 것입니다.

답변

3

나는 이것을 DataContextSpy으로 수행 할 수 있다고 생각합니다.

같은 것을 시도해보십시오 DataContextSpy에 대한

<ItemsControl.Resources> 
    <spy:DataContextSpy x:Key="Spy"/> 
    <app:BitmapProvider x:Key="Converter" ShowDetails="True" 
         Type="{Binding DataContext.Model.Type,Source={StaticResource Spy}}" /> 
</ItemsControl.Resources> 
+0

일을, 내가 너무 나에게 새로운 여기서 뭔가 ... – David

+0

을 배웠습니다. 그러나 그것은 효과적이다. 감사! (나는 여전히 다른 솔루션을 고려 중이다 : 콜렉션의 ViewModel에 의해 호스팅되는 별도의 클래스로 값 비싼 부분을 추출하고 그 결과를 얻기 위해 변환기와 항목의 데이터를 사용하게한다. 그러나 나는 느끼기 때문에 그것을 좋아하지 않는다. 너무 많은 뷰 특정 데이터로 ViewModel을 오염시키는 것 너무 낫다 - 나는 여러 뷰 사이에서 ViewModel을 공유 할 수있는 것을 좋아한다.) – Miral

+0

어떤 종류의 해킹에 대해 걱정하지 않아도된다. 그 기사의 날짜 (2008 년 7 월)를 보면 잠시 동안 주변에 있었음을 알 수 있습니다. 다른 매우 유용한 클래스는 [ElementSpy] (http://joshsmithonwpf.wordpress.com/2008/07/22/enable-elementname-bindings-with-elementspy/)입니다. 유용한 WPF 도우미 목록에 그대로 두십시오! –

관련 문제