我正在寻找在运行时添加WPF控件的最佳方式。我来解释。
- 当应用程序启动时,我想搜索一些数据,并根据这些数据创建一些UI控件
的简单示例
- 启动应用程序
- 搜索配置(在数据库中(
- 根据配置创建或不创建某些控件
以一种非MVVM的方式,我只需创建一个循环来创建或注释这些控件。但我不知道如何在MVVM模式上做到这一点。
我最初的想法是创建所有可能的控件,并根据配置显示或不显示。这是最好的方式吗?
谢谢:(
我正在寻找在运行时添加WPF控件的最佳方式。
如果您不使用代码隐藏,我认为数据模板正是您所需要的。
我希望应用程序在数据库中检查列出了哪些布尔标记,并为每个标记创建一个切换按钮。
您可以使用ItemsControl
和DataTemplate
s来执行此操作。为要显示的每种类型的控件创建一个数据类,例如具有切换状态的bool
属性和标题的ToggleButton
。始终确保实现INotifyPropertyChanged
以在用户界面中反映对数据的更改。
public class MyToggleDataType : INotifyPropertyChanged
{
private bool _isToggled;
private string _title;
public bool IsToggled
{
get => _isToggled;
set
{
if (_isToggled == value)
return;
_isToggled = value;
OnPropertyChanged();
}
}
public string Title
{
get { ... }
set { ...}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
显示要在主视图模型中显示为控件的所有数据项的集合。ObservableCollection
会自动通知诸如添加或删除项目之类的更改。我使用object
的集合,但您也可以在这里使用数据项的基类。
public ObservableCollection<object> MyDataItems { get; }
您需要确保在用户界面中使用此集合之前对其进行初始化,或者在稍后分配时实现INotifyPropertyChanged
以发出其更改的信号。
在XAML中,为您在DataType
属性中指定的每个项数据类型创建一个ItemsControl
并添加一个DataTemplate
。DataTemplate
包含应显示的控件,以及到相应数据项的所有绑定。将ItemsControl
的ItemsSource
绑定到您的MyDataItems
集合。
<ItemsControl ItemsSource="{Binding MyDataItems}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:MyDataType}">
<ToggleButton IsChecked="{Binding IsToggled}"
Content="{Binding Title}"/>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
现在,您只需要从数据库中获取数据,将它们封装在相应的数据项中,或者使用这些数据类型,并将它们添加到MyDataItems
集合中。每次添加项目时,集合都会通知更改,ItemsControl
将搜索相关的数据模板并显示控件。
顺便说一句,如果你想用单个控件来实现这一点,你可以使用ContentControl
,它的工作方式与此相同:公开视图模型属性,将其绑定到Content
属性,并创建一个数据模板来显示它。对于需要创建复杂视图和导航的高级场景,你可能需要使用像Caliburn.Micro、Stylet或Prism这样的MVVM框架,但我认为这不是你的范围。