2016-09-14 38 views
0

我想要将我的TabControl的内容绑定到我的StepViewModel的实例的ObservableCollection步骤。如何将tabcontrol内容的datacontext绑定到observablecollection中的视图模型的实例

我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中存在一个问题,因此它不像您期望的那样绑定数据上下文。这在错误中显示,该绑定尝试在“StepViewModel”而不是“ProcessViewModel”上查找“SelectedStep”属性。简而言之,看看在控件中如何使用C1TabControl.SelectedItem属性。 – ibebbs

+0

'vmns:ProcessViewModel'不是可视化树的一部分,所以你不能使用AncestorType来找到它。你可以用AncestorType做的事情是找到一个* control *,它的'DataContext'是'vmns:ProcessViewModel',它似乎是你的选项卡控件:'DataContext =“{Binding 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进行搜索可能会更简单。这种方法会是这个样子:

更新您的TabControl有一个名称,因此它是搜索的绑定通过的ElementName

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

更新您的StepView通过的ElementName去寻找的TabControl的DataContext的

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

这就是伟大的人,它工作得很好!!!!! – Alex

+0

谢谢你:) – Alex

+0

我很高兴它帮助你 – rmc00

相关问题