C# 如何在XAML中为动态修改的ObservableCollection设置DataContext

C# 如何在XAML中为动态修改的ObservableCollection设置DataContext,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,在我的类主窗口中,我有: public ObservableCollection<ViewModel> VMs .. ViewModel的构造函数是: public class ViewModel : MainViewModel { //Private Members private ObservableCollection<FeeViewModel> _fees; //Properties public ObservableColle

在我的类主窗口中,我有:

public ObservableCollection<ViewModel> VMs ..
ViewModel的构造函数是:

public class ViewModel : MainViewModel
{
    //Private Members
    private ObservableCollection<FeeViewModel> _fees;

    //Properties
    public ObservableCollection<FeeViewModel> FVMs
    {
        get
        {
            return _fees;
        }
        set
        {
            _fees = value;
        }
    }

    //Constructor
    public ViewModel()
    {
        this._fees = new ObservableCollection<FeeViewModel>();
    }
    ...
这部分工作正常。每个ViewModel对象都包含另一个ObservableCollection:

public ObservableCollection<FeeViewModel> FVMs ..
我在XAML中有一个tabcontrol,它使用这个ObservableCollection来做一些事情:

   <TabControl 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}"
            Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0">
        <TabControl.ItemTemplate>                
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                   ...
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
             ...
EnabledTabs是一种在FeeViewModel中使用属性的样式:

    <Style TargetType="{x:Type TabControl}" x:Key="EnabledTabs">
        <Setter Property="IsEnabled" Value="{Binding GotFees}"/>
    </Style>
现在我有一个绑定错误,FVMs为null,窗口中没有显示任何内容。如果我恢复到以前的版本,没有ViewModel对象的ObservableCollection,并且我将TabControl的DataContext设置为单个ViewModel,那么一切都会正常工作

如何将TabControl的DataContext设置为动态创建的ViewModel对象

是否可以在绑定中执行类似VMs/FVMs的操作?
感谢将DataContext添加到TabControl解决了以下问题:

<TabControl 
        DataContext="{Binding VMs, Source={StaticResource ViewModelsSource}}"
        IsSynchronizedWithCurrentItem="True" 
        ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}"
        Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0">

FVMs在任何地方初始化过吗?健全性检查:您说您的ViewModels包含一个ObservableCollection FVMs,但您显然绑定了一个称为FMV的东西。这只是一个输入错误,还是在你的代码中?这将是一个完美的例子,说明为什么你应该使用合理的属性名称。@克莱门斯这不是实际的代码,我在其中使用了合理的属性名称,正如你所建议的。我也将添加更多细节来回答您的问题。@goobering很抱歉这是一个打字错误,FVMs是正确的
   <TabControl 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}"
            Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0">
        <TabControl.ItemTemplate>                
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                   ...
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
             ...
    <Style TargetType="{x:Type TabControl}" x:Key="EnabledTabs">
        <Setter Property="IsEnabled" Value="{Binding GotFees}"/>
    </Style>
<TabControl 
        DataContext="{Binding VMs, Source={StaticResource ViewModelsSource}}"
        IsSynchronizedWithCurrentItem="True" 
        ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}"
        Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0">