1

好的,所以我为此做了很多搜索,我似乎无法解决正确的问题,或者只是没有完成......

基本上,我有一个模块化应用程序,其中包含各种数据驱动的“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}”和 setter对于 Application 必须实例化一个长度为 1 的新“列表”来依次设置 ​​ApplicationList 对象....它可以工作,但它不是很优雅,我想知道是否有另一种方法可以完成此任务

问题 #2

好的,现在我们到了在上面的整个结构中抛出一个活动扳手的部分:如果我想要数据模板中的不同控件基于哪个 Application 对象当前处于活动状态,该怎么办?IE 如果 Application1 当前处于活动状态,请使用 Application1View,但如果 Application2 当前处于活动状态,请使用 Application2View ......这似乎我必须在后面的代码中做一些工作才能让它工作......这让我很震惊如果我坚持使用 MVVM 结构,那是一个很大的禁忌

抱歉啰嗦了,我希望这个问题是有道理的,并感谢你们提供的任何帮助......这使我的项目处于停滞状态,直到我能够解决上述问题

4

2 回答 2

2

DataTemplateSelector可能会派上用场。

于 2013-04-05T17:51:23.280 回答
1

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

于 2013-04-05T18:29:01.627 回答