代码之家  ›  专栏  ›  技术社区  ›  Alex

如何将选项卡控件内容的数据上下文绑定到可观察集合中的视图模型实例

  •  0
  • Alex  · 技术社区  · 8 年前

    TabControl 我的一个实例 StepViewModel 在一个 ObservableCollection 步骤。

    我的ProcessViewModel:

    pubic class ProcessViewModel : ViewModelBase
    {
        public ObservableCollection<StepViewModel> Steps
        {
            get { return _steps; }
            set { _steps = value; OnPropertyChanged("Steps"); }
        }
        public StepViewModel SelectedStep
        {
            // like above...
        }
    }
    

    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错误:40:BindingExpression路径错误: 在“object”“StepViewModel”上找不到“SelectedStep”属性 (哈希代码=32952144)“。绑定表达式:路径=SelectedStep; DataItem=“StepViewModel”(哈希代码=32952144);目标元素是 'StepView'(名称='StepView');目标属性为“DataContext”(类型 '对象')“

    有人知道我怎么解决这个问题吗? 谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   rmc00    8 年前

    看起来RelativeSource在StepView的DataContext绑定上可能有一些小问题。由于模板不是可视化树的一部分,我认为您不能使用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>