2016-09-14 1 views
0

TabControl의 콘텐츠를 내 StepViewModel의 인스턴스로 바인딩하려는 경우 ObservableCollection 단계. tabcontrol 콘텐츠의 datacontext를 observablecollection의 viewmodel 인스턴스에 바인딩하는 방법

내 ProcessViewModel :

pubic class ProcessViewModel : ViewModelBase 
{ 
    public ObservableCollection<StepViewModel> Steps 
    { 
     get { return _steps; } 
     set { _steps = value; OnPropertyChanged("Steps"); } 
    } 
    public StepViewModel SelectedStep 
    { 
     // like above... 
    } 
} 

내 StepViewModel (의 DataContext는 ProcessVM의 단계에서 StepVMs해야한다) :

public class StepViewModel : ViewModelBase 
{ 
    public string Name { get {...} set {...} } 
    public object Media { get {...} set {...} } 
    //... 
} 

내에서 TabControl (의 DataContext가 ProcessViewModel입니다) :

<C1:C1TabControl 
    ItemsSource="{Binding Steps}" 
    SelectedItem="{Binding SelectedStep}" 
    SelectionChanged="{tcSteps_OnSelectionChanged"> 
      <C1:C1TabControl.ContentTemplate> 
       <DataTemplate> 
        <local:StepView 
         DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vmns:ProcessViewModel}}, Path=SelectedStep}" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch"> 
        </local:StepView> 
       </DataTemplate> 
      </C1:C1TabControl.ContentTemplate> 
</C1:C1TabControl> 

컴파일러는 다음 출력 메시지를 전달합니다.

"System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedStep' property not found on 'object' ''StepViewModel' (HashCode=32952144)'. BindingExpression:Path=SelectedStep; DataItem='StepViewModel' (HashCode=32952144); target element is 'StepView' (Name='StepView'); target property is 'DataContext' (type 'Object')"

아무도 내가 해결할 수있는 방법을 알고 있습니까? 감사합니다.

+0

StepViewModel에 SelectedStep이라는 속성이 정의되어 있습니까? – Versatile

+0

C1TabControl에 문제가있어 예상대로 데이터 컨텍스트를 바인딩하지 않는 것처럼 보입니다. 이것은 바인딩이 "ProcessViewModel"대신 "StepViewModel"에서 "SelectedStep"속성을 찾으려고한다는 오류에서 볼 수 있습니다. 즉,''''C1TabControl.SelectedItem''' 속성이 컨트롤 내에서 어떻게 사용되는지보십시오. – ibebbs

+0

'vmns : ProcessViewModel'은 비주얼 트리의 일부가 아니므로 AncestorType을 사용하여 찾을 수 없습니다. AncestorType으로 할 수있는 것은'DataContext'가'vmns : ProcessViewModel' 인 탭 컨트롤 인 * control *을 찾는 것입니다 :'DataContext = "{DataContext.SelectedStep, RelativeSource = {RelativeSource AncestorType = {x : C1 타입 : C1TabControl}} "" –

답변

1

StepView에 대한 DataContext 바인딩에 RelativeSource에 약간의 문제가있을 수 있습니다. 템플릿은 시각적 트리의 일부가 아니기 때문에 FindAncestor를 사용할 수 있다고 생각하지 않습니다. StaticResource를 주 DataContext (예 : http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF)에 대한 포인터로 사용할 수 있지만이 경우 ElementName으로 검색하는 것이 더 간단 할 수도 있습니다. ElementName을하여 StepView가 ElementName에하여 TabControl에의 DataContext를 찾기 위해

<C1:C1TabControl 
    x:Name="MyTabControl" 
    ItemsSource="{Binding Steps}" 
    SelectedItem="{Binding SelectedStep}" 
    SelectionChanged="{tcSteps_OnSelectionChanged"> 

업데이트를 당신을 TabControl에 이름이 할

업데이트, 그것은 바인딩에서 검색 할 수 있도록 : 그 방법은 다음과 같을 것

<local:StepView DataContext="{Binding ElementName=MyTabControl, Path=DataContext.SelectedStep}" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch"> 
    </local:StepView> 
+0

그게 좋은 사람, 아주 잘 작동 !!!!! – Alex

+0

많이 고마워요 :) – Alex

+0

그것이 당신을 도왔다 니 기쁩니다. – rmc00

관련 문제