求助:运行时基于Form选择填充CheckList类型Activity属性
解决方案:CheckList类型属性的动态级联填充
因为IRuntimeSelectListProvider是框架专为Dropdown类型设计的扩展接口,CheckList类型并不兼容,所以需要换两种思路实现级联效果:
方案1:通过属性变更通知手动更新选项
利用INotifyPropertyChanged接口监听「Form」属性的变化,实时更新「FormStructure」的可选选项集合,让CheckList控件绑定到这个集合实现动态更新。
代码示例
public class YourTargetActivity : Activity, INotifyPropertyChanged { private string _selectedForm; [DisplayName("Form")] public string Form { get => _selectedForm; set { _selectedForm = value; OnPropertyChanged(nameof(Form)); // 触发FormStructure选项更新 RefreshFormStructureOptions(); } } [DisplayName("FormStructure")] [UIHint(ActivityInputUIHints.CheckList)] public List<string> SelectedFormStructures { get; set; } = new List<string>(); // 供CheckList控件绑定的可选选项集合 public List<string> AvailableFormStructures { get; set; } = new List<string>(); private void RefreshFormStructureOptions() { // 根据选中的Form类型加载对应结构选项 AvailableFormStructures = Form switch { "UserRegistration" => new List<string> { "用户名", "邮箱", "手机号" }, "OrderSubmission" => new List<string> { "订单ID", "商品名称", "数量" }, _ => new List<string>() }; OnPropertyChanged(nameof(AvailableFormStructures)); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
使用时只需让CheckList控件的可选项数据源绑定到AvailableFormStructures,**选中项绑定到SelectedFormStructures**即可。
方案2:实现自定义CheckList属性编辑器
如果你的框架支持自定义属性编辑器,可以实现IActivityPropertyEditor接口,直接在编辑器层监听「Form」属性变化,动态拉取选项。
代码示例
1. 自定义编辑器实现
public class DynamicCheckListEditor : IActivityPropertyEditor { public FrameworkElement CreateEditor(ActivityPropertyDescriptor propertyDescriptor) { var checkListBox = new CheckListBox(); // 对应框架的CheckList控件 var targetActivity = propertyDescriptor.OwnerActivity as YourTargetActivity; if (targetActivity != null) { // 绑定数据源和选中项 checkListBox.ItemsSource = targetActivity.AvailableFormStructures; checkListBox.SelectedItems = targetActivity.SelectedFormStructures; // 监听Form属性变化,实时更新选项 targetActivity.PropertyChanged += (sender, args) => { if (args.PropertyName == nameof(YourTargetActivity.Form)) { checkListBox.ItemsSource = targetActivity.AvailableFormStructures; } }; } return checkListBox; } }
2. 注册编辑器并标记属性
// 在框架初始化时注册自定义编辑器 ActivityPropertyEditorRegistry.RegisterEditor("DynamicCheckList", typeof(DynamicCheckListEditor)); // 修改FormStructure属性的UIHint [DisplayName("FormStructure")] [UIHint("DynamicCheckList")] public List<string> SelectedFormStructures { get; set; } = new List<string>();
内容的提问来源于stack exchange,提问作者Maruful Islam
相关产品推荐
相关产品推荐

