2016-09-14 41 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

相關問題