hereという奇妙なバインディング動作が発生しました。私は多くのトラブルシューティングを行いましたが、タブのビューのそれぞれのDataContext
をどのように設定するかに最も大きな問題があるとの結論に達しました。WPF MVVM:タブビューのDataContextを設定する
私はTabControl
であり、ItemsSource
はViewModels
のリストにバインドされています。
MainView:
<TabControl ItemsSource="{Binding TabList}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
<v:Tab1 />
</DataTemplate>
</TabControl.Resources>
...
</TabControl>
MainViewModel:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
pubic MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
this.TabList.Add(new Tab1ViewModel()); // Tab1ViewModel is derived from TabViewModelBase
}
だから、今MainViewModel
は、私がこれを行うには、正しいMVVMの道であると信じていTabViewModelBase
のリストを持っています。 TabViewModelBase
のビュー(Tab1
)は、DataTemplate
を使用して定義されています。
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
私はこのアプローチのひどく間違って何かがある ほとんどの人が同様にこれを行うだろうと思いますが、...:
これは、問題がどこにあるかであります!
MainViewModel
では、手動でTab1ViewModel
をインスタンス化しました。 MainView
では、DataTemplate
を使用して、Tab1ViewModel
と表示されたときに、Tab1
を使用するように表示するように指示しました。つまり、MainView
はTab1
クラスのオブジェクトをインスタンス化します。
は今、Tab1
はTab1ViewModel
、独自に結合行うために、そのDataContext
を必要とするので、私たちは、これがブランドの新しいインスタンスであることを除いて、1 Tab1ViewModel
を追加するためにStaticResource
を使用します!
DataContext
を元のMainViewModel
に元の設定に戻す必要があります。したがって、DataContext
のTab1
をDataTemplate
に設定するにはどうすればよいですか?
に置き換えるだけで、Tab1に表示されるすべてのリソースとDataContextコードが削除されます。あなたのViewModelインスタンスはあなたのコレクションにあり、DataControlはあなたのTabControlリソースに定義されています – blindmeis
私の 'Tab1'は' DataContext'を持たず、 'Tab1'と' Tab1ViewModel'の間でバインディングを行うことができません。 – Jai