你好,我有一個應用程序設計問題,我回家,你可以幫我解決它.... 這是我的第一個應用程序在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>
你可以有一個更簡單的時間,如果你不關注它從一本書配入模式..我真的很好奇。 – Fosco 2010-08-24 13:51:18
示例代碼請... – 2010-08-24 13:51:31
沒有人讀過這麼長的問題,請將其縮短。 – NetSide 2010-08-24 14:14:51