在运行时添加控制的更好方法



我正在寻找在运行时添加WPF控件的最佳方式。我来解释。

  • 当应用程序启动时,我想搜索一些数据,并根据这些数据创建一些UI控件

的简单示例

  • 启动应用程序
  • 搜索配置(在数据库中(
  • 根据配置创建或不创建某些控件

以一种非MVVM的方式,我只需创建一个循环来创建或注释这些控件。但我不知道如何在MVVM模式上做到这一点。

我最初的想法是创建所有可能的控件,并根据配置显示或不显示。这是最好的方式吗?

谢谢:(

我正在寻找在运行时添加WPF控件的最佳方式。

如果您不使用代码隐藏,我认为数据模板正是您所需要的。

我希望应用程序在数据库中检查列出了哪些布尔标记,并为每个标记创建一个切换按钮。

您可以使用ItemsControlDataTemplates来执行此操作。为要显示的每种类型的控件创建一个数据类,例如具有切换状态的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并添加一个DataTemplateDataTemplate包含应显示的控件,以及到相应数据项的所有绑定。将ItemsControlItemsSource绑定到您的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框架,但我认为这不是你的范围。

相关内容

  • 没有找到相关文章

最新更新