Можно ли динамически изменять / удалять SwipeItems SwipeControl в UWP? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь использовать новые Microsoft SwipeControl, чтобы пользователи могли показать действие, доступное для элемента.Я борюсь с тем, чтобы удалить SwipeItems, когда действие больше не доступно, я знаю, что это возможно, поскольку установка и обнуление свойства LeftItems на SwipeControl работает так, как я ожидаю, но мне это нужночтобы быть более динамичным, чем это.

Некоторые замечания по настройке, я использую Caliburn Micro в качестве инфраструктуры MVVM и его реализацию INotifyPropertyChanged.Я не использую x: Bind.

Попытка 1 - элемент управления на основе SwipeControl: я попытался создать новый элемент управления на основе SwipeControl.Я добавил DepedencyProps для LeftItemsEnabled и InternalLeftItems.InternalLeftItems используется для хранения списка элементов между каждым удалением и сбросом.Чтобы удалить и сбросить свойство LeftItems, я использую свойство LeftItemsEnabled, изменив логическое значение.Я установил LeftItems на свое значение InternalLeftItems или null.Ниже приведен код:

Свойства зависимостей и реализация PropertyChanged

public static readonly DependencyProperty EnableLeftItemsProperty =
  DependencyProperty.Register("EnableLeftItems", typeof(bool), typeof(UpdatedSwipeControl), new PropertyMetadata(false, LeftEnabledPropertyChanged));

public static readonly DependencyProperty InternalLeftItemsProperty =
  DependencyProperty.Register("InternalLeftItems", typeof(SwipeItems), typeof(UpdatedSwipeControl), new PropertyMetadata(new SwipeItems()));

public SwipeItems InternalLeftItems {
  get { return (SwipeItems)GetValue(InternalLeftItemsProperty); }
  set { SetValue(InternalLeftItemsProperty, value); }
}

private static void LeftEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
  var control = d as UpdatedSwipeControl;
  if (control == null) return;

  control.EnableLeftItems = (bool)e.NewValue;
  if ((bool)e.NewValue)
      control.RightItems = control.InternalRightItems;
    else 
      control.RightItems = null;

    UpdateLayout();
}

Использование в представлении

<Page.Resources>
  <SymbolIconSource x:Key="ButtonIconSource"
                    Symbol="Cancel" />
  <SwipeItems x:Key="Items">
     <SwipeItem Text="SWIPE ITEM"
                IconSource="{StaticResource ButtonIconSource}"
                Background="Red" />
  </SwipeItems>
</Page.Resources>

<controls:UpdatedSwipeControl x:Name="swipeControl"
                              EnableLeftItems={Binding ItemsEnabled}
                              InternalLeftItems="{StaticResource Items}">
  <TextBlock Text="SWIPE" />
</SwipeControl>

Свойство во ViewModel

private bool itemsEnabled;
public bool ItemsEnabled {
  get {
    return itemsEnabled;
  }
  set {
    itemsEnabled = value;
    NotifyOfPropertyChange(nameof(ItemsEnabled));
  }
}

Проблемас этой попыткой LeftEnabledPropertyChanged запускается только один раз при изменении значения по умолчанию False на True при первоначальном связывании.Он не срабатывает снова ни на одном из последующих NotifyPropertyChanged.Я не уверен, что что-то пропустил в моей настройке DependencyProps или PropertyChangedEvent.

Попытка 2 - Конвертер на пропозиции LeftItems: Моя вторая попытка состояла в том, чтобы использовать Converter для привязки boolean.Я создал простой конвертер для возврата либо SwipeItems в мои ресурсы, либо null.Ниже приведен код:

Код преобразователя

public class ItemsConverter : IValueConverter {

  public SwipeItems items { get; set; }

  public object Convert(object value, Type targetType, object parameter, string language)
  {
    return (bool) value ? items : null;
  }

  public object ConvertBack(object value, Type targetType, object parameter, string language)
  {
    throw new NotImplementedException();
  }
}

Реализация в представлении

<Page.Resources>
  <sampleApp:ItemsConverter x:Key="converter" items="{StaticResource Items}"/>
  <SwipeItems x:Key="Items">
     <SwipeItem Text="SWIPE ITEM"
                IconSource="{StaticResource ButtonIconSource}"
                Background="Red" />
  </SwipeItems>
</Page>

<SwipeControl x:Name="swipeControl"
              LeftItems="{Binding ItemsEnabled, Converter={StaticResource converter}}">
  <TextBlock Text="SWIPE" />
</SwipeControl>

Та же реализация свойства ItemsEnabled в ViewModel.Проблема с этой попыткой заключалась в том, что преобразователь никогда не срабатывал и ошибок привязки не было.

Подводя итог, я знаю, что можно установить / сбросить свойство SwipeItems с помощью code-behind, которое хорошо работает в очень простых сценариях.,Но ничего более динамичного я не могу заставить работать.Кто-нибудь еще сталкивался с этой проблемой или имеет обходной путь к этому?

...