2016-09-14 4 views
0

私のTabControlの内容をのインスタンスにバインドしたい場合は、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 =" {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で検索する方が簡単かもしれないと思います。その方法は、次のようなものになります。それはElementNameの

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

によってバインディングで検索可能ですので、名前を持っているあなたのTabControlを更新

をElementNameのでのTabControlのDataContextのを探すために、あなたのStepViewを更新

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

それは素晴らしい人、それは非常にうまくいく!!!!! – Alex

+0

ありがとうございました:) – Alex

+0

私はそれがあなたを助けてくれてうれしいです – rmc00

関連する問題