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

具有从ListBox wpf继承的选中对象逻辑的自定义控件,wpf,checkbox,listbox,controls,Wpf,Checkbox,Listbox,Controls,我需要一个自定义控件,如ListBox,但具有选中对象逻辑(可以选中对象,可以绑定到CheckedObjects集合,可以将选中模式从“单个”切换到“多个”)。我开始向从ListBoxItem(CheckedListboxItem)和ListBox(CheckedListBox)继承的控件添加依赖项属性和RoutedEvents,但我不知道如何使我的CheckedListBox使用CheckedListboxItem而不是ListBoxItem。 是的,我知道模板,但我不能在我的业务对象中实现I

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

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);
    }
  }
公共部分类CheckedListBox:ListBox
{
公共CheckedListBox()
{
初始化组件();
}
公共静态只读从属属性CheckEditsProperty;
公共静态只读路由事件CheckedChangedEvent;
公共静态只读RoutedEvent ItemCheckedEvent;
公共静态只读RoutedEvent ItemUnCheckedEvent;
静态CheckedListBox()
{
CheckedItemsProperty=DependencyProperty.Register(“CheckedItems”、typeof(IList)、typeof(CheckedListBox)、new FrameworkPropertyMetadata(new ArrayList()、new PropertyChangedCallback(OnCheckedItemChanged));
CheckedChangedEvent=EventManager.RegisterRoutedEvent(“CheckedChanged”,RoutingStrategy.Bubble,typeof(RoutedPropertyChangedEventHandler),typeof(CheckedListBoxItem));
EventManager.RegisterClassHandler(typeof(CheckedListBox)、CheckedListBoxItem.CheckedEvent、,
新的路由EventHandler(选中EventHandler));
EventManager.RegisterClassHandler(typeof(CheckedListBox)、CheckedListBoxItem.UnCheckedEvent、,
新的路由登塔德勒(未选中登塔德勒);
}
私有静态void checkedEventHandler(对象发送方,RoutedEventTargs e)
{
var checkedListBox=(checkedListBox)发送方;
var item=(CheckedListBoxItem)e.OriginalSource;
var collection=checkedListBox.CheckedItems;
集合。添加(项。内容);
}
私有静态void取消选中Deventhandler(对象发送方,RoutedEventArgs e)
{
var checkedListBox=(checkedListBox)发送方;
var item=(CheckedListBoxItem)e.OriginalSource;
var collection=checkedListBox.CheckedItems;
集合。移除(项。内容);
}
公共静态事件依赖项PropertyChangedEventHandler CheckeditMschanged;
公共事件路由EventHandler ItemChecked
{
添加{AddHandler(ItemCheckedEvent,value);}
移除{RemoveHandler(ItemCheckedEvent,value);}
}
公共事件路由EventHandler项未选中
{
添加{AddHandler(ItemUnCheckedEvent,value);}
删除{RemoveHandler(ItemUnCheckedEvent,value);}
}
公共IList支票
{
获取{return(IList)GetValue(CheckedItemsProperty);}
set{SetValue(checkeditemsprroperty,value);}
}
私有静态void oncheckedItemChanged(DependencyObject发送方,DependencyPropertyChangedEventArgs e)
{
var checkedListBox=(checkedListBox)发送方;
var args=newRoutedPropertyChangedEventArgs((IList)e.OldValue,(IList)e.NewValue);
args.RouteEvent=CheckedListBox.CheckedChangedEvent;
选中ListBox.RaiseEvent(args);
}
受保护的覆盖布尔IsItemItsOwnContainerOverride(对象项)
{
返回(项目已选中ListBoxItem);
}
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新的CheckedListBoxItem();
}
}
公共类CheckedListBoxItem:ListBoxItem
{
公共静态依赖性是被检查的属性;
公共静态只读路由事件CheckChangedEvent;
公共静态只读RoutedEvent CheckedEvent;
公共静态只读路由事件未选中;
公共场所被检查
{
获取{return(bool)GetValue(IsCheckedProperty);}
set{SetValue(IsCheckedProperty,value);}
}
公共事件RoutedPropertyChangedEventHandler CheckChanged
{
添加{AddHandler(CheckChangedEvent,value);}
删除{RemoveHandler(CheckChangedEvent,value);}
}
静态CheckedListBoxItem()
{
IsCheckedProperty=DependencyProperty.Register(“IsChecked”、typeof(bool)、typeof(CheckedListBoxItem)、new FrameworkPropertyMetadata(false、new PropertyChangedCallback(OnCheckChanged));
CheckChangedEvent=EventManager.RegisterRoutedEvent(“CheckChanged”,RoutingStrategy.Bubble,typeof(RoutedPropertyChangedEventHandler),typeof(CheckedListBoxItem));
CheckedEvent=EventManager.RegisterRoutedEvent(“选中”,RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(CheckedListBoxItem));
UnCheckedEvent=EventManager.RegisterRouttedEvent(“UnChecked”,RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(CheckedListBoxItem));
}
更改后的私有静态无效(DependencyObject发件人、DependencyPropertyChangedEventArgs e)
{
var checkedListBoxItem=(checkedListBoxItem)发送方;
var oldValue=(bool)e.oldValue;
var newValue=(bool)e.newValue;
if((bool)e.NewValue&!(bool)e.OldValue)
{
var argch=新路由EventArgs(CheckedListBoxItem.CheckedEvent);
checkedListBoxItem.RaiseEvent(argch);
}
else if(!(bool)e.NewValue&(bool)e.OldValue)
{
var argun=新路由EventArgs(选中ListBoxItem.UnCheckedEvent);
checkedListBoxItem.RaiseEvent(argun);
}
var args=新RoutedPropertyChangedEventArgs(旧值,新值);
args.RouteEvent=CheckedListBoxItem.CheckChangedEvent;
checkedListBoxItem.RaiseEvent(args);
}
}

<>代码> > p>为了使您的检查BOXLIST使用CHECKBOXISTITEM,您应该考虑重写GETCubEngReIfEfReIdEd()方法。看看这个:

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

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

但我无法在我的业务对象中实现IsChecked属性。
-IsChecked(或IsSelected)应该是ViewModel关注点,而不是业务模型关注点。请看@HighCore,对不起,我是说当然是ViewModel。问题是这些物体