Usercontrol的PropertyChangedCallback未被触发

时间:2016-05-14 13:27:17

标签: c# wpf xaml

我真的很难尝试使列表框多选可绑定,基本上与本文相同:http://blogs.microsoft.co.il/miziel/2014/05/02/wpf-binding-listbox-selecteditems-attached-property-vs-style/

这是我的列表框类:

public partial class ListBoxMultipleSelection : UserControl
{
    public ListBoxMultipleSelection()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public static readonly DependencyProperty ItemSourceProperty =
    DependencyProperty.Register("ItemSource", typeof(ObservableCollection<string>), typeof(ListBoxMultipleSelection), new PropertyMetadata(new ObservableCollection<string>()));
    public ObservableCollection<string> ItemSource
    {
        get { return (ObservableCollection<string>)this.GetValue(ItemSourceProperty); }
        set { this.SetValue(ItemSourceProperty, value); }
    }

    private static ListBox list;
    private static bool _isRegisteredSelectionChanged = false;

    ///
    /// SelectedItems Attached Dependency Property
    ///
    public static readonly DependencyProperty SelectedItemsProperty =
    DependencyProperty.RegisterAttached("SelectedItems", typeof(IList),
    typeof(ListBoxMultipleSelection),
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
    new PropertyChangedCallback(OnSelectedItemsChanged)));

    public static IList GetSelectedItems(DependencyObject d)
    {
        return (IList)d.GetValue(SelectedItemsProperty);
    }

    public static void SetSelectedItems(DependencyObject d, IList value)
    {
        d.SetValue(SelectedItemsProperty, value);
    }

    private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!_isRegisteredSelectionChanged)
        {
            var listBox = (ListBox)d;
            list = listBox;
            listBox.SelectionChanged += listBox_SelectionChanged;
            _isRegisteredSelectionChanged = true;
        }
    }

    private static void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        IEnumerable listBoxSelectedItems = list.SelectedItems;
        IList ModelSelectedItems = GetSelectedItems(list);
        ModelSelectedItems.Clear();
        if (list.SelectedItems != null)
        {
            foreach (var item in list.SelectedItems) 
                ModelSelectedItems.Add(item);
        }
        SetSelectedItems(list, ModelSelectedItems);
    }
}

用户控件/列表框的XAML:

<Grid>
    <ListBox SelectionMode="Multiple"
             local:ListBoxMultipleSelection.SelectedItems="{Binding DataContext.SelectedItems}" 
             ItemsSource="{Binding DataContext.ItemSource, ElementName=MultiListBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

问题是“listBox_SelectionChanged”从未被触发,因此没有正确更新。有什么想法吗?

谢谢

0 个答案:

没有答案