2010-05-12 36 views
3

我开始在MVVM模式中重写我的整个silverlight商业应用程序;我的第一个停止点是这样的:在Silverlight和MVVM中动态添加视图

我有一个页面(View1)与相应的ViewModel1(具有属性'IEnumerable AllData');

现在,在这个视图中,我想要有一个树视图控件,其中一个节点将被另一个视图2填充;

我的问题是: 1.怎么做? - 我无法通过AllData属性循环,因为它是异步加载的... - 因此我不知道要插入的View2的数量“ - 我不知道如何从ViewModel1(

  • 我需要ViewModel2财产 'MyDataEntity CURRENTDATA'?
    • 或者我可以从ViewModel1
    • 结合ALLDATA财产
  • 你能帮助我出?

    谢谢

    +0

    不ViewModel2需要访问ALLDATA或只有一个特定的项目? – Stephan 2010-05-12 17:47:59

    +0

    ViewModel2应该需要的全部是AllData [index],它是MyDataEntity的一个实例,需要与View2控件绑定; 事情是,我需要以某种方式迭代通过AllData并生成/追加尽可能多的View2控件作为AllData中的成员IEnumerable – dvox 2010-05-13 06:39:10

    回答

    1

    它听起来像你试图把主/从视图放在一起? MasterView包含所有DetailView的TreeView。

    所以的ViewModels看起来像

    public class DataListViewModel 
    { 
        public DataDetailViewModel[] AllData {get;} 
    } 
    
    public class DataDetailViewModel 
    { 
        public Data Model {get;} 
        public DataListViewModel Parent {get;} 
    } 
    

    如果这或多或少是准确的,那么你有一个非常简单的前进道路你自己的,你需要做的是使视图或视图模型的选择第一。

    通过查看第一选择,您可以使用DataTemplate作为TreeView来控制TreeViews Item。

    <DataTemplate x:Key="dataTemplate"> 
        <my:DataDetailView DataContext="{Binding Path=.}" /> 
    </DataTemplate> 
    

    只要确保您的视图有一个默认的构造函数。

    使用ViewModel的第一个选择,您将需要使用TemplateSelector根据设置的对象将正确的视图拉出。这可能是最灵活的,因为您可以使用基于Detail类的不同视图。

    请参阅以下链接了解更多信息http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector