2013-04-05 71 views
1

好吧,所以我做了一堆搜索,并且我似乎无法将我的头围绕正确的问题,或者它只是没有完成...WPF使用MVVM动态添加单个控件通过绑定使用MVVM

基本上我有一个模块化的应用程序,其中包含各种数据驱动的'Applets',它可能会根据已提供给用户的权限进行更改和动态添加。我已经在Flex中构建了这个应用程序,并且我们通过MVVM将它移植到WPF中,因为它使我们更容易编码和维护。

现在,有两个问题,我想弄清楚:

问题#1

我需要能够通过结合动态地添加一个单一的控制。我已经使用ItemsControl上的数据模板构建了绑定,这些模板连接到ViewModel中的对象列表,并且工作起来很奇妙,但是当我知道只有一个控件时,系统似乎有点冒失,但它使我现在。

这里是我的代码,为了说明为什么这似乎哈克对我说:

XAML

<ItemsControl ItemsSource="{Binding ApplicationList}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CTRL:PortalApplicationControl /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

视图模型

/// <summary> 
/// A List to contain the currently active application for binding to the ItemsControl in XAML 
/// </summary> 
public List<Models.Application> ApplicationList 
{ 
    get { return (List<Models.Application>)GetValue(ApplicationListProperty); } 
    set { SetValue(ApplicationListProperty, value); } 
} 
public static readonly DependencyProperty ApplicationListProperty = 
    DependencyProperty.Register("ApplicationList", typeof(List<Models.Application>), typeof(ApplicationVM)); 

/// <summary> 
/// The currently active application 
/// </summary> 
public Models.Application Application 
{ 
    get { return (Models.Application)GetValue(ApplicationProperty); } 
    set { SetValue(ApplicationProperty, value); ApplicationList = new List<Models.Application>() { Application }; } 
} 
public static readonly DependencyProperty ApplicationProperty = 
    DependencyProperty.Register("Application", typeof(Models.Application), typeof(ApplicationVM)); 

正如你所看到的,这是哈克就意味着绑定到Application依赖项属性上的属性的对象能够调用'{Binding Application.Name}',但ItemsControl必须调用'{Binding ApplicationList}',并且Application的setter必须实例化一个长度为1的新'List'以依次设置ApplicationList对象。 。它的工作原理,但它不是很优雅,我想知道是否有完成这个任务的另一种方式

问题2:

好了,现在我们得到抛出猴子扳手在部分上面的整个结构:如果我想要根据哪个Application对象当前处于活动状态在数据模板中使用不同的控件,该怎么办? I.E.如果Application1当前处于活动状态,请使用Application1View,但是如果Application2当前处于活动状态,请使用Application2View ...这看起来好像我将不得不在代码中执行一些工作才能使其工作......并且这让我感到担忧一个大的不,如果我坚持MVVM结构

对不起,长时间的啰嗦,我希望这个问题是合理的,并感谢您提供的任何帮助......这是我的项目停滞不前直到我能解决以上问题

+0

我无法准确理解您要找的内容。你想为任何一个ViewModel使用不同的视图吗? – jugg1es 2013-04-05 17:42:44

+1

如果只有一个控件在同一时间,请使用ContentControl:http://msdn.microsoft.com/en-us/library/vstudio/system.windows.controls.contentcontrol。aspx – 2013-04-05 18:00:02

+0

@FlorianGl这就是我正在寻找的东西,如果你想回答这个问题,请把它作为答案发布,所以我可以这样做...... @ jugg1es不,对于每个应用程序都会有不同的视图和视图模型,我想要传递给用户界面并打开的是模型,然后确定显示哪个视图作为结果...然后通过依赖注入,viewmodel在通过数据模板创建视图时得到解决 – 2013-04-05 18:14:23

回答

1

如果只有一个控件在同一时间,请使用ContentControl

+0

只是想注意到,我实现了这一点,它工作真棒,感谢您的提示 – 2013-04-05 21:37:17

2

DataTemplateSelector可能派上用场。

+0

真棒,这似乎喜欢它会解决问题2很好...我upvoted,但我只能选择一个答案,我的主要问题是在问题1 ...但感谢您的及时响应! – 2013-04-05 17:53:35

+0

只是想注意到,我实施了这个,它工作真棒,感谢您的提示 – 2013-04-05 21:37:35