2010-08-24 6 views
0

Привет, у меня проблема с дизайном приложения, и я дома, вы можете помочь мне решить эту проблему .... Это мое первое приложение в silverlight и первое приложение с использованием шаблона проектирования mvvm, и я не уверен, что я применяю MVVM, как я должен ..design pattern problem

Приложение представляет собой динамическое приложение и во время выполнения я могу добавить/удалить UserControls ...

Так что у меня MainWindowView, который имеет за MainWindowModel.

MainWindowModel имеет список Рабочей ведьмы фактически являются классами WorkspaceModel ...

У меня есть несколько UserControls и все от них имеют свою собственную вид модель ведьма наследует WorkspaceModel.

Свойство Workspaces привязано к контейнеру в MainWindowView, поэтому добавление в список Workspaces нового UserControlModel автоматически добавит этот элемент управления в представление. Теперь, где моя проблема ... Я хочу, чтобы эти динамически добавленные пользовательские элементы управления взаимодействовали. Допустим, что один пользовательский элемент управления является деревом, а один - сеткой ... Я хочу, чтобы метод указывал, что свойство Itemsource модели Grid UserControl (WorkspaceModel) привязывается к элементу SelectedNode.Nodes из модели Usercontrol модели дерева (WorkspaceModel).

MainWindowModel имеет имя свойство BindingEntries ведьма имеет список BindingEntry ... BindingEntry сохраняет свойство источника и назначения свойство связывания, как мой workspacemodel_1.SelectedNode.Nodes -> workspacemodel_2.ItemSource ...

Или в качестве варианта MainWindowView имеет свойство ViewStateModel. Этот класс ViewStateModel имеет динамически созданные свойства - «впрыскивается» с дескрипторами/отражениями типа свойств и т. Д. Таким образом, пользователь может определить во время выполнения отображаемые пользовательские элементы управления (путем изменения списка Workspaces) и может определять модель представления (ViewStameModel) и привязка между свойствами рабочей области и свойствами ViewStateModel ...

Так что я действительно хочу связать 2 модели взглядов друг с другом ... Как это сделать? Создать шаблон наблюдателя? Является ли дизайн до сих пор совершенно неправильным?

Я надеюсь, что это имеет смысл .....

Я пытаюсь добавить некоторые примеры кода ... проект довольно большой, я постараюсь сотрудничество поставить только ту часть, о которой я упоминал в задаче Дайте описание. .. Я надеюсь, что я не пропустите ни одного Pice кода

Прежде всего

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"); 
      } 
     } 

} 

фрагменты из 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 
    } 

<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

+1

Образец кода, пожалуйста ... – 2010-08-24 13:51:31

+6

Никто не читает такой длинный вопрос, пожалуйста, сделайте это коротко. – NetSide

ответ

0

Для общения между вашими моделями зрения, я хотел бы предложить взглянуть на реализацию Посланника в MVVM Light как простое решение.

В качестве альтернативы, Посредник шаблон, как описано здесь, может быть интересно: http://marlongrech.wordpress.com/2008/03/20/more-than-just-mvc-for-wpf/