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

时间:2015-04-12 11:22:14

标签: c# wpf xaml mvvm

在我的班级MainWindow中,我有:

public ObservableCollection<ViewModel> VMs ..

MainWindow是在XAML中构建的(它也在类构造函数中创建了一个空的VM):

<Window.Resources>
        <c:MainViewModel x:Key="ViewModelsSource"/>
</Window.Resources>

当我点击一个按钮时,我将ViewModel对象添加到ObservableCollection VM中,ObservableCollection的内容显示在ListBox中:

<StackPanel DataContext="{Binding Source={StaticResource ViewModelsSource}}">
        <ListBox IsSynchronizedWithCurrentItem="True" 
                 ItemsSource="{Binding VMs}" 
                 Background="Transparent" 
                 HorizontalContentAlignment="Stretch"
                 > ...

命令添加的代码是:

    void AddListExecute()
    {
        VMs.Add(new ViewModel());
    }

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>

现在我有一个绑定错误,FVM为null并且窗口中没有显示任何内容。如果我恢复到没有ObservableCollection的ViewModel对象的先前版本,并且我将TabControl的DataContext设置为单个ViewModel,一切正常。

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

是否可以在绑定中执行类似虚拟机/ FVM的操作? 感谢

1 个答案:

答案 0 :(得分:0)

通过向TabControl添加DataContext来解决:

<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">