具有从ListBox WPF继承的选中对象逻辑的自定义控件

夜莺

我需要一个自定义控件,例如ListBox,但是具有检查对象逻辑(可以检查对象,可以绑定到CheckedObjects集合,可以将检查模式从“单个”切换到“多个”)。我从将依赖项属性和RoutedEvents添加到从ListBoxItem(CheckedListboxItem)和ListBox(CheckedListBox)继承的控件中开始,但是我不知道如何使我的CheckedListBox使用CheckedListBoxItem而不是ListBoxItem。是的,我了解模板,但是我无法在我的业务对象中实现IsChecked属性。
更新。代码:

public partial class CheckedListBox : ListBox
  {
    public CheckedListBox()
    {
      InitializeComponent();
    }

    public static readonly DependencyProperty CheckedItemsProperty;
    public static readonly RoutedEvent CheckedChangedEvent;
    public static readonly RoutedEvent ItemCheckedEvent;
    public static readonly RoutedEvent ItemUnCheckedEvent;

    static CheckedListBox()
    {
      CheckedItemsProperty = DependencyProperty.Register("CheckedItems", typeof(IList), typeof(CheckedListBox), new FrameworkPropertyMetadata(new ArrayList(), new PropertyChangedCallback(OnCheckedItemsChanged)));
      CheckedChangedEvent = EventManager.RegisterRoutedEvent("CheckedChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<bool>), typeof(CheckedListBoxItem));
      EventManager.RegisterClassHandler(typeof(CheckedListBox), CheckedListBoxItem.CheckedEvent,
        new RoutedEventHandler(checkedEventHandler));
      EventManager.RegisterClassHandler(typeof(CheckedListBox), CheckedListBoxItem.UnCheckedEvent,
        new RoutedEventHandler(unCheckedEventHandler));
    }

    private static void checkedEventHandler(object sender, RoutedEventArgs e)
    {
      var checkedListBox = (CheckedListBox)sender;
      var item = (CheckedListBoxItem)e.OriginalSource;
      var collection = checkedListBox.CheckedItems;
      collection.Add(item.Content);
    }

    private static void unCheckedEventHandler(object sender, RoutedEventArgs e)
    {
      var checkedListBox = (CheckedListBox)sender;
      var item = (CheckedListBoxItem)e.OriginalSource;
      var collection = checkedListBox.CheckedItems;
      collection.Remove(item.Content);
    }

    public static event DependencyPropertyChangedEventHandler CheckedItemsChanged;

    public event RoutedEventHandler ItemChecked
    {
      add { AddHandler(ItemCheckedEvent, value); }
      remove { RemoveHandler(ItemCheckedEvent, value); }
    }
    public event RoutedEventHandler ItemUnChecked
    {
      add { AddHandler(ItemUnCheckedEvent, value); }
      remove { RemoveHandler(ItemUnCheckedEvent, value); }
    }
    public IList CheckedItems
    {
      get { return (IList)GetValue(CheckedItemsProperty); }
      set { SetValue(CheckedItemsProperty, value); }
    }

    private static void OnCheckedItemsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
      var checkedListBox = (CheckedListBox)sender;
      var args = new RoutedPropertyChangedEventArgs<IList>((IList)e.OldValue, (IList)e.NewValue);
      args.RoutedEvent = CheckedListBox.CheckedChangedEvent;
      checkedListBox.RaiseEvent(args);
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
      return (item is CheckedListBoxItem);
    }

    protected override DependencyObject GetContainerForItemOverride()
    {
      return new CheckedListBoxItem();
    }
  }

  public class CheckedListBoxItem : ListBoxItem
  {
    public static DependencyProperty IsCheckedProperty;
    public static readonly RoutedEvent CheckChangedEvent;
    public static readonly RoutedEvent CheckedEvent;
    public static readonly RoutedEvent UnCheckedEvent;

    public bool IsChecked
    {
      get { return (bool)GetValue(IsCheckedProperty); }
      set { SetValue(IsCheckedProperty, value); }
    }

    public event RoutedPropertyChangedEventHandler<bool> CheckChanged
    {
      add { AddHandler(CheckChangedEvent, value); }
      remove { RemoveHandler(CheckChangedEvent, value); }
    }


    static CheckedListBoxItem()
    {
      IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(CheckedListBoxItem), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnCheckChanged)));
      CheckChangedEvent = EventManager.RegisterRoutedEvent("CheckChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<bool>), typeof(CheckedListBoxItem));
      CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CheckedListBoxItem));
      UnCheckedEvent = EventManager.RegisterRoutedEvent("UnChecked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CheckedListBoxItem));
    }

    private static void OnCheckChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
      var checkedListBoxItem = (CheckedListBoxItem)sender;
      var oldValue = (bool)e.OldValue;
      var newValue = (bool)e.NewValue;
      if ((bool)e.NewValue && !(bool)e.OldValue)
      {
        var argch = new RoutedEventArgs(CheckedListBoxItem.CheckedEvent);
        checkedListBoxItem.RaiseEvent(argch);
      }
      else if (!(bool)e.NewValue && (bool)e.OldValue)
      {
        var argun = new RoutedEventArgs(CheckedListBoxItem.UnCheckedEvent);
        checkedListBoxItem.RaiseEvent(argun);
      }
      var args = new RoutedPropertyChangedEventArgs<bool>(oldValue, newValue);
      args.RoutedEvent = CheckedListBoxItem.CheckChangedEvent;
      checkedListBoxItem.RaiseEvent(args);
    }
  }
刺猬

为了使CheckBoxList使用CheckBoxListItem,您应该考虑重写方法GetContainerForItemOverride()。看看这个:

  public class ForceDirectedItemsControl : ItemsControl
  {
      protected override bool IsItemItsOwnContainerOverride(object item)
      {
          return (item is ForceDirectedItem);
      }

      protected override DependencyObject GetContainerForItemOverride()
      {
          return new ForceDirectedItem();
      }
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有数据绑定的ListBox中的自定义计算字段

来自分类Dev

具有自定义用户控件的WPF单选按钮组冲突

来自分类Dev

具有自定义类型和插入控件的WPF ListView绑定

来自分类Dev

在WPF的Codebehind中隐藏具有Datatemplate的ListBox的项目

来自分类Dev

如何在wpf中处理具有大量ItemSource的ListBox?

来自分类Dev

具有不同类型的多个来源的WPF ListBox

来自分类Dev

在WPF的Codebehind中隐藏具有Datatemplate的ListBox的项目

来自分类Dev

具有对象继承的存储库中的Spring Data自定义查询

来自分类Dev

如何在DataGridView显示对象的值中具有自定义控件?

来自分类Dev

创建内部具有逻辑的自定义属性

来自分类Dev

具有自定义逻辑的可重用UITableViewCell

来自分类Dev

具有自定义逻辑的网桥/路由器

来自分类Dev

创建内部具有逻辑的自定义属性

来自分类Dev

如何继承具有.xib文件的自定义视图

来自分类Dev

创建具有覆盖onclick的自定义控件

来自分类Dev

具有自定义控件的MPMoviewcontroller和AVPlayer

来自分类Dev

具有自定义控件的MPMoviewcontroller和AVPlayer

来自分类Dev

具有自定义IDownloadManager的WebBrowser控件的AccessViolationException

来自分类Dev

具有溢出布局的UWP自定义控件

来自分类Dev

具有相同修改的自定义控件验证器

来自分类Dev

具有自定义样式的WPF继承的Datepicker不允许将子级标签到

来自分类Dev

具有自定义OnPaint的F#中的自定义Windows.Forms控件?

来自分类Dev

C#Xamarin表单-具有属性的自定义控件上的自定义事件

来自分类Dev

wpf自定义控件库和wpf类库有什么区别

来自分类Dev

WPF ListBox自定义项

来自分类Dev

具有AllowsTransparency =“ False”的WPF自定义窗口

来自分类Dev

具有和不具有自动布局的自定义控件

来自分类Dev

继承的WPF自定义控件不继承父命令

来自分类Dev

子控件未继承 WPF 自定义控件样式

Related 相关文章

  1. 1

    具有数据绑定的ListBox中的自定义计算字段

  2. 2

    具有自定义用户控件的WPF单选按钮组冲突

  3. 3

    具有自定义类型和插入控件的WPF ListView绑定

  4. 4

    在WPF的Codebehind中隐藏具有Datatemplate的ListBox的项目

  5. 5

    如何在wpf中处理具有大量ItemSource的ListBox?

  6. 6

    具有不同类型的多个来源的WPF ListBox

  7. 7

    在WPF的Codebehind中隐藏具有Datatemplate的ListBox的项目

  8. 8

    具有对象继承的存储库中的Spring Data自定义查询

  9. 9

    如何在DataGridView显示对象的值中具有自定义控件?

  10. 10

    创建内部具有逻辑的自定义属性

  11. 11

    具有自定义逻辑的可重用UITableViewCell

  12. 12

    具有自定义逻辑的网桥/路由器

  13. 13

    创建内部具有逻辑的自定义属性

  14. 14

    如何继承具有.xib文件的自定义视图

  15. 15

    创建具有覆盖onclick的自定义控件

  16. 16

    具有自定义控件的MPMoviewcontroller和AVPlayer

  17. 17

    具有自定义控件的MPMoviewcontroller和AVPlayer

  18. 18

    具有自定义IDownloadManager的WebBrowser控件的AccessViolationException

  19. 19

    具有溢出布局的UWP自定义控件

  20. 20

    具有相同修改的自定义控件验证器

  21. 21

    具有自定义样式的WPF继承的Datepicker不允许将子级标签到

  22. 22

    具有自定义OnPaint的F#中的自定义Windows.Forms控件?

  23. 23

    C#Xamarin表单-具有属性的自定义控件上的自定义事件

  24. 24

    wpf自定义控件库和wpf类库有什么区别

  25. 25

    WPF ListBox自定义项

  26. 26

    具有AllowsTransparency =“ False”的WPF自定义窗口

  27. 27

    具有和不具有自动布局的自定义控件

  28. 28

    继承的WPF自定义控件不继承父命令

  29. 29

    子控件未继承 WPF 自定义控件样式

热门标签

归档