首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含不同文档的WPF Devexpress文档组

包含不同文档的WPF Devexpress文档组
EN

Stack Overflow用户
提问于 2015-03-04 22:03:46
回答 2查看 702关注 0票数 1

我正在尝试用MVVM来完成这个场景。我想有一个带有一些动态文档的DockLayoutManager,每个文档将显示不同的视图。

假设我有DockLayoutManager和它的ViewModel,我还有另外3个视图(用户控件),它们有自己的视图模型,我的MainWIndow.xaml代码:

代码语言:javascript
复制
  <UserControl x:Class="BrowserTabManager"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
         xmlns:dxd="http://schemas.devexpress.com/winfx/2008/xaml/docking"
         xmlns:local="clr-namespace:WPFiRecsTest1"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="600"
         d:DesignWidth="300"
         mc:Ignorable="d">

<UserControl.DataContext>
    <local:BrowserTabManagerViewModel />
</UserControl.DataContext>

<UserControl.Resources>
    <DataTemplate DataType="{x:Type local:ResultsViewModel}">
        <local:ResultsView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:WorksheetViewModel}">
        <local:WorksheetView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:CrystalReportViewModel}">
        <local:CrystalReportView />
    </DataTemplate>
</UserControl.Resources>

<dxd:DockLayoutManager FloatingMode="Desktop">
    <dxd:LayoutGroup>
        <dxd:LayoutGroup x:Name="panelHost" />
        <dxd:DocumentGroup x:Name="documentHost" ItemsSource="{Binding TabPages}" />
    </dxd:LayoutGroup>
</dxd:DockLayoutManager>
</UserControl>  

值得庆幸的是,这是可行的。每个文档都有自己的视图。但是我不知道应该如何绑定标题标题,以及应该在哪里绑定标题标题:

BrowserTabManagerViewModel的代码如下:

代码语言:javascript
复制
 Imports System.Collections.ObjectModel
 Imports DevExpress.Mvvm
 Public Class BrowserTabManagerViewModel
 Inherits ViewModelBase

Private mTabPages As New ObservableCollection(Of ViewModelBase)()
Public Property TabPages() As ObservableCollection(Of ViewModelBase)
    Get
        Return mTabPages
    End Get
    Set(value As ObservableCollection(Of ViewModelBase))
        RaisePropertyChanged("TabPages")
    End Set
End Property

Private miSelectedTabIndex As Integer
Public Property SelectedTabIndex() As Integer
    Get
        Return miSelectedTabIndex
    End Get
    Set(value As Integer)
        If value <> miSelectedTabIndex Then
            miSelectedTabIndex = value
            RaisePropertyChanged("SelectedTabIndex")
        End If
    End Set
End Property

Public Sub New()
    mTabPages.Add(New ResultsViewModel()) 
    mTabPages.Add(New WorksheetViewModel()) 
    mTabPages.Add(New CrystalReportViewModel())
End Sub
EN

回答 2

Stack Overflow用户

发布于 2015-03-05 15:04:28

但是我不知道应该如何绑定标题标题以及应该在哪里绑定标题标题

您应该通过DocumentPanel的默认样式声明该绑定:

代码语言:javascript
复制
<UserControl.Resources>
    <Style TargetType="dxd:DocumentPanel"> 
        <Setter Property="Caption" Value="{Binding ViewModelPropertyForCaption}" /> 
    </Style> 
    ...
    <DataTemplate DataType="{x:Type local:ResultsViewModel}">
    ...

</UserControl.Resources>

对于这种情况的最佳解决方案,如原始问题中所述,是为所有这些ViewModels创建基类型,并将Header属性分离到此类中:

代码语言:javascript
复制
public class BaseDocumentViewModel {
    public virtual string ViewModelPropertyForCaption { get; set; }
}
...
public class ResultsViewModel : BaseDocumentViewModel {
    //...
}

相关帮助-文章:MVVM Support - Building Dock UI

一个完整的例子在网上可以找到:How to Build a dock UI using the MVVM pattern

票数 0
EN

Stack Overflow用户

发布于 2015-03-05 16:59:29

所以我找到了一种方法(也许不是最好的)

所以xaml是:

代码语言:javascript
复制
<UserControl x:Class="BrowserTabManager"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
         xmlns:dxd="http://schemas.devexpress.com/winfx/2008/xaml/docking"
         xmlns:local="clr-namespace:WPFiRecsTest1"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="600"
         d:DesignWidth="300"
         mc:Ignorable="d">

<UserControl.DataContext>
    <local:BrowserTabManagerViewModel />
</UserControl.DataContext>

<UserControl.Resources>
   <Style TargetType="{x:Type dxd:DocumentPanel}">
           <Setter Property="Caption" Value="{Binding DisplayName}" />
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <ContentControl Content="{Binding Content}" />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
</UserControl.Resources>

<dxd:DockLayoutManager x:Name="dockLayoutManager"
                       ClosedPanelsBarVisibility="Never"
                       ClosingBehavior="ImmediatelyRemove"
                       FloatingMode="Desktop"
                       ItemsSource="{Binding TabPages}">

    <dxd:LayoutGroup x:Name="panelHost">
        <dxd:DocumentGroup x:Name="documentHost" />
    </dxd:LayoutGroup>
</dxd:DockLayoutManager>
</UserControl>

我有一个文档的视图模型(BrowserTabViewModel),它有一个标题属性(displayName)和一个文档内容属性(TabPage是模型):

代码语言:javascript
复制
Public Property Content() As UserControl
    Get
        Return TabPage.Content
    End Get
    Set(ByVal value As UserControl)
        TabPage.Content = value
        RaisePropertyChanged("Content")
    End Set
End Property

现在,主ViewModel (BrowserTabManagerViewModel)如下所示:

代码语言:javascript
复制
Imports System.Collections.ObjectModel
Imports DevExpress.Mvvm
Public Class BrowserTabManagerViewModel
Inherits ViewModelBase



Private mTabPages As New ObservableCollection(Of BrowserTabViewModel)()
Public Property TabPages() As ObservableCollection(Of BrowserTabViewModel)
    Get
        Return mTabPages
    End Get
    Set(value As ObservableCollection(Of BrowserTabViewModel))
        RaisePropertyChanged("TabPages")
    End Set
End Property



Public Sub New()

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "RES", .DisplayName = "Result1", .Content = New ResultsView})

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "WOR", .DisplayName = "worksheet", .Content = New WorksheetView})

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "CRR", .DisplayName = "Crystal", .Content = New CrystalReportView})

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "DXR", .DisplayName = "DX REport", .Content = New DXReportView})

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "DAR", .DisplayName = "Data Report", .Content = New DataReportView})

    mTabPages.Add(New BrowserTabViewModel() With {.Type = "ADD", .DisplayName = "+", .Content = New BrowserAddMenuView})
End Sub
End Class

如果任何人有任何改进建议,请让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28856454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档