如何在 MVVM 模式中动态添加 UserControl?
How to dynamically add a UserControl in MVVM pattern?
这是一个示例源,可以帮助解释我的解释
<ItemsControl ItemsSource="{Binding PaggingButtonList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<UserControl Name="{Binding ViewName}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我想像上面的代码一样动态添加。不幸的是,我知道添加视图的唯一方法是 .所以我想知道分配给什么?部分动态查找和添加我的项目的视图文件。谢谢
您可以使用 ContentControl
来托管您的 UserControl
:
<ItemsControl ItemsSource="{Binding ViewList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name,Converter={StaticResource NameToContentConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
定义 ObservableCollection:
public ObservableCollection<object> ViewList { get; set; } =
new ObservableCollection<object>();
稍后添加内容
ViewList.Add(new View() { Name = "yourUserControlName" });
你的 View
Class:
public class View
{
public string Name { get; set; } = "";
}
因为 ContentControl.Content 期望对象并且您将其作为 string
传递
你可以使用转换器。
转换器:
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();
}
}
要了解有关 Activator 的更多信息,请参阅 here
这是一个示例源,可以帮助解释我的解释
<ItemsControl ItemsSource="{Binding PaggingButtonList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<UserControl Name="{Binding ViewName}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我想像上面的代码一样动态添加。不幸的是,我知道添加视图的唯一方法是 .所以我想知道分配给什么?部分动态查找和添加我的项目的视图文件。谢谢
您可以使用 ContentControl
来托管您的 UserControl
:
<ItemsControl ItemsSource="{Binding ViewList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name,Converter={StaticResource NameToContentConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
定义 ObservableCollection:
public ObservableCollection<object> ViewList { get; set; } =
new ObservableCollection<object>();
稍后添加内容
ViewList.Add(new View() { Name = "yourUserControlName" });
你的 View
Class:
public class View
{
public string Name { get; set; } = "";
}
因为 ContentControl.Content 期望对象并且您将其作为 string
传递
你可以使用转换器。
转换器:
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();
}
}
要了解有关 Activator 的更多信息,请参阅 here