在我的班级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的操作? 感谢
答案 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">