好的,所以我为此做了很多搜索,我似乎无法解决正确的问题,或者只是没有完成......
基本上,我有一个模块化应用程序,其中包含各种数据驱动的“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 结构,那是一个很大的禁忌
抱歉啰嗦了,我希望这个问题是有道理的,并感谢你们提供的任何帮助......这使我的项目处于停滞状态,直到我能够解决上述问题