Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF使用MVVM通过绑定动态添加单个控件_C#_Wpf_Mvvm - Fatal编程技术网

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

C# WPF使用MVVM通过绑定动态添加单个控件,c#,wpf,mvvm,C#,Wpf,Mvvm,好吧,我为此做了一系列的搜索,我要么似乎无法围绕正确的问题思考,要么就是没有完成 基本上,我有一个模块化应用程序,其中包含各种数据驱动的“小程序”,这些小程序可能会发生变化,并根据提供给用户的权限动态添加。我已经在Flex中构建了这个应用程序,我们正在通过MVVM将它迁移到WPF中,因为对我们来说,编写和维护它要容易一百万倍 现在,我想找出两个问题: 问题#1 我需要能够通过绑定动态添加单个控件。我已经在ItemsControl上使用数据模板构建了绑定,这些ItemsControl连接到View

好吧,我为此做了一系列的搜索,我要么似乎无法围绕正确的问题思考,要么就是没有完成

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

现在,我想找出两个问题:

问题#1

我需要能够通过绑定动态添加单个控件。我已经在ItemsControl上使用数据模板构建了绑定,这些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));
//
///包含用于绑定到XAML中ItemsControl的当前活动应用程序的列表
/// 
公共列表应用程序列表
{
获取{return(List)GetValue(ApplicationListProperty);}
set{SetValue(ApplicationListProperty,value);}
}
公共静态只读从属属性ApplicationListProperty=
DependencyProperty.Register(“应用程序列表”、类型(列表)、类型(应用程序虚拟机));
/// 
///当前活动的应用程序
/// 
公共模型.应用程序
{
获取{return(Models.Application)GetValue(ApplicationProperty);}
set{SetValue(ApplicationProperty,value);ApplicationList=new List(){Application};}
}
公共静态只读从属属性ApplicationProperty=
DependencyProperty.Register(“应用程序”,typeof(Models.Application),typeof(ApplicationVM));
正如您所看到的,绑定到应用程序依赖项属性上的属性的对象可以调用{binding Application.Name},但ItemsControl必须调用{binding ApplicationList},这是一种很有攻击性的行为应用程序的setter必须实例化一个长度为1的新“List”来依次设置ApplicationList对象……它可以工作,但不是很优雅,我想知道是否有其他方法来完成这项任务

第2期

好的,现在我们来讨论一下在上面的整个结构中使用活动扳手的部分:如果我希望在数据模板中基于当前活动的应用程序对象使用不同的控件,该怎么办?也就是说,如果Application1当前处于活动状态,请使用Application1View,但如果Application2当前处于活动状态,请使用Application2View…这似乎意味着我必须在代码中做一些工作才能使其正常工作…如果我坚持使用MVVM结构,这对我来说是一个很大的拒绝


对不起,我的话太多了,我希望这个问题有意义,感谢你们提供的帮助……这让我的项目陷于停顿,直到我能解决上述问题。

可能会派上用场。

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

我很难准确理解您要找的是什么。你想为任何一个ViewModel使用不同的视图吗?如果同时只有一个控件,请使用ContentControl:@FlorianGl这正是我要找的,如果你想得到答案,请将其作为答案发布,以便我可以这样做…@jugg1es否,每个应用程序都会有不同的视图和viewmodel,我想传递到UI并打开的是模型,然后确定显示哪个视图…然后通过依赖项注入,viewmodel将在通过数据模板创建视图时得到解决,这似乎能很好地解决问题2…我投了赞成票,但我只能选择一个答案,我的主要问题是问题1…但感谢您的及时回复!我只是想说我实现了这个,它工作得很好,谢谢你的提示。我只是想说我实现了这个,它工作得很好,谢谢你的提示