繁体   English   中英

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

[英]Better way to add control during runtime

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

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

简单的例子

  • 开始申请
  • 搜索配置(在数据库中)
  • 根据配置创建或不创建一些控件。

以非 MVVM 的方式,我简单地创建一个循环来创建或记录这些控件。 但我不知道如何在 MVVM 模式上做到这一点。

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

谢谢 :)

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

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

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

您可以使用ItemsControlDataTemplate来做到这一点。 为您想要显示的每种类型的控件创建一个数据类,例如一个ToggleButton ,它将具有用于切换状态和标题的bool属性。 始终确保实现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 中,创建一个ItemsControl并为您在DataType属性中指定的每个项目数据类型添加一个DataTemplate DataTemplate包含应显示的控件,以及与相应数据项的所有绑定。 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 框架,但我认为这不是您的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM