如何将 tabcontrol 内容的数据上下文绑定到 observablecollection 中的视图模型实例
How to bind the datacontext of a tabcontrol content to an instance of an viewmodel in a observablecollection
我想在 ObservableCollection
个步骤中将我的 TabControl
的内容绑定到我的 StepViewModel
的一个实例。
我的 ProcessViewModel:
pubic class ProcessViewModel : ViewModelBase
{
public ObservableCollection<StepViewModel> Steps
{
get { return _steps; }
set { _steps = value; OnPropertyChanged("Steps"); }
}
public StepViewModel SelectedStep
{
// like above...
}
}
我的StepViewModel(DataContext应该是Steps of ProcessVM中的StepVMs):
public class StepViewModel : ViewModelBase
{
public string Name { get {...} set {...} }
public object Media { get {...} set {...} }
//...
}
我的 TabControl(DataContext 是 ProcessViewModel):
<C1:C1TabControl
ItemsSource="{Binding Steps}"
SelectedItem="{Binding SelectedStep}"
SelectionChanged="{tcSteps_OnSelectionChanged">
<C1:C1TabControl.ContentTemplate>
<DataTemplate>
<local:StepView
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vmns:ProcessViewModel}}, Path=SelectedStep}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</local:StepView>
</DataTemplate>
</C1:C1TabControl.ContentTemplate>
</C1:C1TabControl>
编译器提供以下输出消息:
"System.Windows.Data Error: 40 : BindingExpression path error:
'SelectedStep' property not found on 'object' ''StepViewModel'
(HashCode=32952144)'. BindingExpression:Path=SelectedStep;
DataItem='StepViewModel' (HashCode=32952144); target element is
'StepView' (Name='StepView'); target property is 'DataContext' (type
'Object')"
有谁知道我该如何解决?
谢谢!
看起来 StepView 的 DataContext 绑定上的 RelativeSource 可能存在一些小问题。由于模板不是可视化树的一部分,我认为您不能使用 FindAncestor。您可以使用 StaticResource 作为指向主 DataContext 的指针(例如 http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF),但我认为在这种情况下仅通过 ElementName 搜索可能更简单。该方法看起来像这样:
更新您的 TabControl 以具有名称,以便可以通过 ElementName 在绑定中搜索它
<C1:C1TabControl
x:Name="MyTabControl"
ItemsSource="{Binding Steps}"
SelectedItem="{Binding SelectedStep}"
SelectionChanged="{tcSteps_OnSelectionChanged">
更新您的 StepView 以通过 ElementName 查找 TabControl 的 DataContext
<local:StepView DataContext="{Binding ElementName=MyTabControl, Path=DataContext.SelectedStep}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</local:StepView>
我想在 ObservableCollection
个步骤中将我的 TabControl
的内容绑定到我的 StepViewModel
的一个实例。
我的 ProcessViewModel:
pubic class ProcessViewModel : ViewModelBase
{
public ObservableCollection<StepViewModel> Steps
{
get { return _steps; }
set { _steps = value; OnPropertyChanged("Steps"); }
}
public StepViewModel SelectedStep
{
// like above...
}
}
我的StepViewModel(DataContext应该是Steps of ProcessVM中的StepVMs):
public class StepViewModel : ViewModelBase
{
public string Name { get {...} set {...} }
public object Media { get {...} set {...} }
//...
}
我的 TabControl(DataContext 是 ProcessViewModel):
<C1:C1TabControl
ItemsSource="{Binding Steps}"
SelectedItem="{Binding SelectedStep}"
SelectionChanged="{tcSteps_OnSelectionChanged">
<C1:C1TabControl.ContentTemplate>
<DataTemplate>
<local:StepView
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vmns:ProcessViewModel}}, Path=SelectedStep}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</local:StepView>
</DataTemplate>
</C1:C1TabControl.ContentTemplate>
</C1:C1TabControl>
编译器提供以下输出消息:
"System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedStep' property not found on 'object' ''StepViewModel' (HashCode=32952144)'. BindingExpression:Path=SelectedStep; DataItem='StepViewModel' (HashCode=32952144); target element is 'StepView' (Name='StepView'); target property is 'DataContext' (type 'Object')"
有谁知道我该如何解决? 谢谢!
看起来 StepView 的 DataContext 绑定上的 RelativeSource 可能存在一些小问题。由于模板不是可视化树的一部分,我认为您不能使用 FindAncestor。您可以使用 StaticResource 作为指向主 DataContext 的指针(例如 http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF),但我认为在这种情况下仅通过 ElementName 搜索可能更简单。该方法看起来像这样:
更新您的 TabControl 以具有名称,以便可以通过 ElementName 在绑定中搜索它
<C1:C1TabControl
x:Name="MyTabControl"
ItemsSource="{Binding Steps}"
SelectedItem="{Binding SelectedStep}"
SelectionChanged="{tcSteps_OnSelectionChanged">
更新您的 StepView 以通过 ElementName 查找 TabControl 的 DataContext
<local:StepView DataContext="{Binding ElementName=MyTabControl, Path=DataContext.SelectedStep}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
</local:StepView>