Переоценка выражения Binding? - PullRequest
0 голосов
/ 15 апреля 2019

Я создаю пользовательский элемент управления, который имеет среди других свойств: Command, CommandProperty и SelectedItems типа object, которые могут быть просто объектом или ObservableCollection<object> в зависимости от другого свойства IsMultiSelect.

Вот элемент управления на эмуляторе Android (в его свойстве ItemsSource есть 4 элемента):

enter image description here

Теперь мне нужно привязать CommandParameter к SelectedItems:

<controls:TogglesRow x:Name="TogRow"
                     ItemsSource="{Binding Items}" DisplayMemberPath="Name"
                     Command="{Binding ItemSelectedCommand}" 
                     CommandParameter="{Binding Source={x:Reference TogRow}, 
                     Path=SelectedItems}"/>

Но проблема в том, что он берет предыдущий SelectedItems, что означает, что при первом выборе элемента, CommandParameter равно null, в следующий раз будет выбран первый выбранный элемент ... и т. д.

btn - это нажатая кнопка (настраиваемая кнопка), которая инициализируется в делегате propertyChangedСвойства пользовательского интерфейса (ItemsSourceProperty, DisplayMemberPathProperty .. и т. Д.)):

//In the foreach that process the ItemsSource collection:
btn.SelectionChanged += (s, e) =>
            {
                if (IsMultiSelect)
                {
                    if (btn.IsSelected)
                        (SelectedItems as ObservableCollection<object>).Add(item);
                    else
                        (SelectedItems as ObservableCollection<object>).Remove(item);
                }
                else
                {
                    var allToggleButtons = stackContainer.Children.Where(x => x is ToggleButton);
                    allToggleButtons?.ForEach(x => ((ToggleButton)x).IsSelected = false);
                    btn.IsSelected = true;
                    SelectedItems = item;
                }
                if (!IsMultiSelect && btn.IsSelected)
                    SelectedItemsChanged?.Invoke(this, new TogglesRowSelectionChangedEventArgs
                    {
                        SelectedItems = SelectedItems,
                        SelectedIndices = ItemsSource.IndexOf(item)
                    });
                else if (IsMultiSelect)
                {
                    SelectedItemsChanged?.Invoke(this, new TogglesRowSelectionChangedEventArgs
                    {
                        SelectedItems = SelectedItems,
                        SelectedIndices = (SelectedItems as ObservableCollection<object>).Select(x => ItemsSource.IndexOf(x))
                    });
                }
                Command?.Execute(CommandParameter);

            };

Свойства привязки:

public static readonly BindableProperty CommandProperty =
            BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(TogglesRow), null);

        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        public static readonly BindableProperty CommandParameterProperty =
            BindableProperty.Create(nameof(CommandParameter), typeof(object), typeof(TogglesRow), null);

        public object CommandParameter
        {
            get { return GetValue(CommandParameterProperty); }
            set { SetValue(CommandParameterProperty, value); }
        }

        public static readonly BindableProperty SelectedItemsProperty = BindableProperty.Create(nameof(SelectedItems), typeof(object), typeof(TogglesRow),
            defaultBindingMode: BindingMode.TwoWay);
        public object SelectedItems
        {
            get { return GetValue(SelectedItemsProperty); }
            set { SetValue(SelectedItemsProperty, value); }
        }

Я знаю, что это логично, но в любом случае, поздняя привязка свойство CommandParameter.Например, повторно оцените выражение привязки, чтобы получить самую последнюю SelectedItems?

...