проблема шаблона дизайна - PullRequest
0 голосов
/ 24 августа 2010

Здравствуйте, у меня есть проблема с дизайном приложения, и я дома, вы можете помочь мне решить ее. Это мое первое приложение в silverlight и первое приложение, использующее шаблон проектирования mvvm, и я не уверен, что применяю mvvm как япредполагается ..

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

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

У MainWindowModel есть список рабочих областей, которые на самом деле являются классами WorkspaceModel ...

У меня есть несколько пользовательских элементов управления, и у каждого из них есть своя собственная модель представления, которая наследует WorkspaceModel.

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

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

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

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

Надеюсь, это имеет смысл .....

Я попытаюсь добавить пример кода ... Проект довольно большой, я попробую сопоместите только ту часть, которую я упомянул в описании проблемы ... Надеюсь, я не пропущу ни одной части кода

Прежде всего

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>

1 Ответ

0 голосов
/ 25 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...