【发布时间】:2015-06-17 18:59:44
【问题描述】:
在我的班级 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 为空,并且窗口中没有显示任何内容。如果我在没有 ViewModel 对象的 ObservableCollection 的情况下恢复到以前的版本,并将 TabControl 的 DataContext 设置为该单个 ViewModel,一切正常。
如何将 TabControl 的 DataContext 设置为动态创建的 ViewModel 对象?
是否可以在绑定中执行类似 VM/FVM 的操作? 谢谢
【问题讨论】:
-
FVMs是否曾在任何地方初始化过? -
完整性检查:您说您的 ViewModel 包含一个 ObservableCollection
FVM,但您显然已经绑定到称为 FMV 的东西。这只是一个错字,还是在您的代码中? -
这就是为什么你应该使用合理的属性名称的完美例子。
-
@Clemens 这不是实际代码,正如您所建议的,我在其中使用了合理的属性名称。我还将添加更多详细信息来回答您的问题。
-
@goobering 抱歉打错了,FVM 是正确的