WPF使用MVVM通过绑定动态添加单个控件

时间:2013-04-05 17:39:37

标签: c# wpf mvvm

好的,所以我做了一堆搜索,我或者似乎无法绕过正确的问题,或者只是没有完成......

基本上我有一个模块化应用程序,它包含各种数据驱动的“Applet”,它们可能会根据提供给用户的权限进行更改并动态添加。我已经在Flex中构建了这个应用程序,我们正在通过MVVM将它移动到WPF,因为它对我们的代码和维护来说要容易一百万次。

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

问题#1

我需要能够通过绑定动态添加单个控件。我已经使用ItemsControls上的数据模板构建了绑定,这些模板连接到ViewModel中的对象列表,并且工作得非常好,但是当我知道只有一个控件但它能让我获得时,该系统看起来有点hacky到现在为止。

这是我的代码,以显示为什么这对我来说似乎很难看:

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}”这一意义上是hacky。并且应用程序的setter必须实例化一个长度为1的新“List”来依次设置ApplicationList对象....它可以工作,但它不是很优雅,我想知道是否有另一种方法来完成这个任务< / p>

问题#2

好的,现在我们到达上面整个结构中抛出一个猴子扳手的部分:如果我想根据哪个Application对象当前处于活动状态而在数据模板中有不同的控件怎么办? I.E.如果Application1当前处于活动状态,请使用Application1View,但如果Application2当前处于活动状态,请使用Application2View ...这似乎我将不得不在后面的代码中做一些工作才能让它工作......这让我感到震惊如果我坚持使用MVVM结构

,那就大不了

很抱歉长篇大论,我希望这个问题有道理,感谢你们提供的任何帮助......这让我的项目陷入停顿,直到我能解决上述问题

2 个答案:

答案 0 :(得分:2)

DataTemplateSelector可能派上用场。

答案 1 :(得分:1)

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