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