如何在MVVM模式中动态添加UserControl?

use*_*045 3 wpf mvvm-light

这是帮助解释我的解释的示例源

<ItemsControl ItemsSource="{Binding PaggingButtonList}">            
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <UserControl Name="{Binding ViewName}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

我想在上面的代码中动态添加.不幸的是,添加我知道的视图的唯一方法是.所以我想知道要分配什么?用于动态查找和添加项目的View文件的部分.谢谢

在此输入图像描述

tab*_*bby 6

您可以ContentControl用来托管您的UserControl:

 <ItemsControl ItemsSource="{Binding ViewList}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding Name,Converter={StaticResource NameToContentConverter}}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
Run Code Online (Sandbox Code Playgroud)

定义ObservableCollection:

public ObservableCollection<object> ViewList { get; set; } = 
  new ObservableCollection<object>();
Run Code Online (Sandbox Code Playgroud)

并在以后添加内容

ViewList.Add(new View() { Name = "yourUserControlName" });
Run Code Online (Sandbox Code Playgroud)

你的View班级:

public class View
{
    public string Name { get; set; } = "";
}
Run Code Online (Sandbox Code Playgroud)

由于ContentControl.Content期望对象,并且您将它作为一个传递,string 您可以使用Converter.

转换器:

public class NameToContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value != null)
        {
            Type userControl =  Type.GetType(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name +"."+ value,null,null);
            return Activator.CreateInstance(userControl);
        }
        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

要了解有关Activator的更多信息,请参阅此处

输出: