【问题标题】:Content Binding in AvalonDock 2.0AvalonDock 2.0 中的内容绑定
【发布时间】:2015-11-17 23:42:42
【问题描述】:

我正在尝试将我的一些旧 AvalonDock 概念分配给 AD 2.0。我注意到DocumentContentLayoutDocument 取代。通过访问LayoutDocumentPane.Children.add() 可以轻松添加表单。但是,新表单的创建是在我的应用程序中线程化的(InitializeComponents 需要一段时间),并且将文档添加到停靠系统是通过调用执行的。这会导致 InvalidOperation,我猜它无法修复,因为它是 WPF。我希望通过使用绑定来处理这个问题。从我的 AD1 代码开始,我意识到所有属性都在 Content 对象中。将Content. 添加到绑定源将使我的文档标题看起来像模板定义的一样。在此处查看我的 XAML:

<AD:DockingManager Name="dockManager" DocumentsSource="{Binding Documents}" >
   <AD:DockingManager.DocumentHeaderTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Content.IconSource}" />
            <TextBlock Text="{Binding Content.Title}" />
         </StackPanel>
      </DataTemplate>
   </AD:DockingManager.DocumentHeaderTemplate>
   <AD:LayoutRoot PropertyChanged="OnLayoutRootPropertyChanged">
        <AD:LayoutPanel Orientation="Horizontal" >
            <AD:LayoutDocumentPaneGroup>
                <AD:LayoutDocumentPane>
                </AD:LayoutDocumentPane>
             </AD:LayoutDocumentPaneGroup>
             <AD:LayoutAnchorablePaneGroup DockWidth="300">
                <AD:LayoutAnchorablePane x:Name="rightPanel">
                </AD:LayoutAnchorablePane>
            </AD:LayoutAnchorablePaneGroup>
       </AD:LayoutPanel>
   </AD:LayoutRoot>
</AD:DockingManager>

文档定义:

public ObservableCollection<LayoutDocument> Documents { get; private set; }

如果我现在向Documents 添加一些新表单,标题是正确的,但没有显示窗口内容。而不是打印窗口的类名。我认为它与标题类似,并且缺少对.Content 的一些引用,并且我在更高级别上看到了对象的一些.ToString() 结果。如何判断Content是分配给窗口内容的?

如果我的方法有谬误,请告诉我。

【问题讨论】:

    标签: c# wpf avalondock


    【解决方案1】:

    我认为您需要在DockingManager 中添加一些resources 以显示与ViewModel Instance 对应的视图,

    <AD:DockingManager.Resources>
      <DataTemplate DataType="{x:Type ViewModels:ViewModel1}">// your ViewModel Name comes here.
                    <Views:View1 DataContext="{Binding}" /> // your View Comes here. DataContext is not required if you specify it on the UserControl.      
      </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModels:ViewModel2}">
                    <Views:View2 DataContext="{Binding}" />       
      </DataTemplate>
    </AD:DockingManager.Resources>
    

    你的Documents collection 应该有ViewModel 实例

    EDIT基于下面的cmets,

     <AD:DockingManager>
         <AD:LayoutRoot>
            <AD:LayoutPanel Orientation="Vertical">
                    <AD:LayoutDocumentPaneGroup>
                        <AD:LayoutDocumentPane>
                           <!--Your View/UserControl goes here-->
                        </AD:LayoutDocumentPane>
                        <AD:LayoutDocumentPane>
                           <!--Your View/UserControl goes here-->
                        </AD:LayoutDocumentPane>
                    </AD:LayoutDocumentPaneGroup>
                 </AD:LayoutPanel>
            </AD:LayoutRoot>
      </AD:DockingManager>
    

    【讨论】:

    • 谢谢。您能否在这里解释或举例说明ViewModels:AdvancedSearchViewModelViews 是什么? (我对 WPF 比较陌生)
    • 如果LayoutDocument 没有DataContext 怎么办?
    • 好的,如果 DataContext 不可用,您不想添加它。我猜您将UserControls 作为文档的不同视图,并且每个UserControl 都与ViewModel 相关联。如果是这种情况,那么创建您的 ViewModel 实例并添加到您的 Documents 集合中即可。
    • @NilsKeller 在答案中添加了一些 cmets 看看。
    • 是的,作为不同的用户控件,我在 WindowsFormsHost 中使用 OpenTK(WinForms OpenGL 控件)。我不确定如何定义 View 和 ViewModel。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多