2010-08-24 83 views
0

你好,我有一個應用程序設計問題,我回家,你可以幫我解決它.... 這是我的第一個應用程序在silverlight和第一個應用程序使用mvvm設計模式,我不知道我申請MVVM如何我應該..設計模式問題

應用程序是一個動態的應用程序,在運行時,我可以添加/刪除用戶控件...

所以我必須具有MainWindowModel背後MainWindowView。

的MainWindowModel有工作區女巫的列表實際上WorkspaceModel類...

我有多個用戶控件,每個人都過他們有自己的看法模型女巫繼承了WorkspaceModel。

Workspaces屬性綁定到MainWindowView中的容器,因此添加到工作區列表中,新的UserControlModel將自動將該控件添加到視圖。 現在我的問題在哪裏......我想讓這個動態添加的usercontrols進行交互。比方說,一個用戶控件是一棵樹,一個是一個網格...我想要一個方法來說,將Grid UserControl Model(WorkspaceModel)的Itemsource屬性綁定到來自樹用​​戶控件模型(WorkspaceModel)的SelectedNode.Nodes屬性。

的MainWindowModel有一個屬性名稱BindingEntries女巫BindingEntry列表... BindingEntry存儲源屬性和像我workspacemodel_1.SelectedNode.Nodes綁定的目標屬性 - > workspacemodel_2.ItemSource ...

或者作爲一個變體,MainWindowView有一個屬性ViewStateModel。這個ViewStateModel類具有動態創建的屬性 - 用屬性類型描述符/反射等「注入」。因此,用戶可以在運行時定義顯示的用戶控件(通過修改工作區列表),並可以定義視圖模型(ViewStameModel)和綁定之間workspacemodel屬性和此ViewStateModel屬性...

所以我實際上想要綁定2個視圖模型彼此...如何做到這一點? 創建一個觀察者模式? 到現在爲止的設計完全錯了嗎?

我希望這是有道理的.....

我會嘗試添加一些示例代碼......該項目是相當大的,我會盡量合作只放我在這個問題提到應將描述部分。 ..我希望我不會錯過任何代碼PICE

首先從MainappView

<DataTemplate x:Key="WorkspaceItemTemplate"> 
      <Grid > 

       //workaround to use Type as in WPF 
       <Detail:DetailsViewSelector Content="{Binding}" TemplateType="{Binding}" > 
        <Detail:DetailsViewSelector.Resources> 
         <DataTemplate x:Key="TreeControlModel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
          <TreeControl:TreeControlView /> 
         </DataTemplate> 
         <DataTemplate x:Key="GridControlModel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
          <GridControl:GridControlView /> 
         </DataTemplate> 
         <DataTemplate x:Key="EmptyTemplate"> 
         </DataTemplate> 
        </Detail:DetailsViewSelector.Resources> 
       </Detail:DetailsViewSelector> 
      </Grid> 
     </DataTemplate> 
     <DataTemplate x:Key="WorkspacesTemplate"> 
      <ItemsControl IsTabStop="False" ItemsSource="{Binding}" ItemTemplate="{StaticResource WorkspaceItemTemplate}" Margin="6,2"/> 
     </DataTemplate> 
    </UserControl.Resources> 

<toolkit:HeaderedContentControl Grid.Column="2" HorizontalAlignment="Stretch" Name="hccWorkspaces" VerticalAlignment="Top" Header="Workspaces" Content="{Binding Source={StaticResource vm}, Path=Workspaces}" ContentTemplate="{StaticResource WorkspacesTemplate}"/> 





public class ControlFactory 
     { 
      public static WorkspaceModel CreateModel(string type, int id) 
      { 
       switch (type) 
       { 
        case "TreeControlModel": return new TreeControlModel() { Id=id}; break; 
        case "GridControlModel": return new GridControlModel() { Id = id }; break; 
       } 
       return null; 
      } 
     } 









public class GridControlModel : WorkspaceModel 
    { 
     #region Fields 
     ObservableCollection<TreeItem> _items; 
     TreeItem _selectedItem; 
     #endregion // Fields 

     #region Constructor 

     public GridControlModel() 
     { 

      base.DisplayName = "GridControlModel"; 
     } 
     #endregion // Constructor 

     #region Public Interface 

     public ObservableCollection<TreeItem> Items 
     { 
      get 
      { 
       return _items; 
      } 
      set 
      { 
       if (_items == value) 
        return; 
       _items = value; 
       OnPropertyChanged("Items"); 
      } 
     } 
     public TreeItem SelectedItem 
     { 
      get 
      { 
       return _selectedItem; 
      } 
      set 
      { 
       if (_selectedItem.Equals(value)) 
       { 
        return; 
       } 
       _selectedItem = value; 
       OnPropertyChanged("SelectedItem"); 
      } 
     } 

     #endregion // Public Interface 

     #region Base Class Overrides 

     protected override void OnDispose() 
     { 
      this.OnDispose(); 
     } 

     #endregion // Base Class Overrides 
    } 
所有

public class MainWindowModel : ModelBase 
    { 
     private ObservableCollection<WorkspaceModel> _workspaces; 
     private ModelBase _userViewModel; 
    public MainWindowModel() 
     { 
      base.DisplayName = "MainWindowModel"; 
      ShowTreeView(1); 
      ShowTreeView(2); 
      ShowGridView(3); 
      ShowGridView(4); 
      UserViewModel = new ViewModel(); //this is the ViewStateModel 
     } 
    void ShowTreeView(int id) 
     { 
      WorkspaceModel workspace = ControlFactory.CreateModel("TreeControlModel", id); 
      this.Workspaces.Add(workspace); 
      OnPropertyChanged("Workspaces"); 
      SelectedWorkspace = workspace; 
     } 
     void ShowGridView(int id) 
     { 
      WorkspaceModel workspace = ControlFactory.CreateModel("GridControlModel", id); 
      this.Workspaces.Add(workspace); 
      OnPropertyChanged("Workspaces"); 
      SelectedWorkspace = workspace; 
     } 
public ObservableCollection<WorkspaceModel> Workspaces 
     { 
      get 
      { 
       if (_workspaces == null) 
       { 
        _workspaces = new ObservableCollection<WorkspaceModel>(); 
       } 
       return _workspaces; 
      } 
     } 
    public ModelBase UserViewModel 
     { 
      get 
      { 
       return _userViewModel; 
      } 
      set 
      { 
       if (_userViewModel == value) 
       { 
        return; 
       } 
       _userViewModel = value; 

       OnPropertyChanged("UserViewModel"); 
      } 
     } 

} 

片斷

<Grid x:Name="LayoutRoot" Background="White"> 
     <sdk:DataGrid Grid.Column="2" Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch" ItemsSource="{Binding Path=SelectedTreeNode.Children}" IsEnabled="{Binding}" AutoGenerateColumns="False"> 
      <sdk:DataGrid.Columns> 
       <sdk:DataGridTextColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Id" Width="Auto" Binding="{Binding Id}" /> 
       <sdk:DataGridTextColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Name" Width="Auto" Binding="{Binding Name}"/> 
      </sdk:DataGrid.Columns> 
     </sdk:DataGrid> 
    </Grid> 
</UserControl> 
+3

你可以有一個更簡單的時間,如果你不關注它從一本書配入模式..我真的很好奇。 – Fosco 2010-08-24 13:51:18

+1

示例代碼請... – 2010-08-24 13:51:31

+6

沒有人讀過這麼長的問題,請將其縮短。 – NetSide 2010-08-24 14:14:51

回答