是否可以在UWP中动态更改/删除SwipeControl的SwipeItems?

时间:2018-10-18 16:00:29

标签: c# uwp uwp-xaml

我正在尝试使用Microsoft的新SwipeControl,以允许用户显示该项目可用的操作。我正在努力的是在操作不再可用时删除SwipeItems,我知道可以在LeftItems上设置SwipeControl属性并使其无效为预期的效果,但是我需要它比这更具动态性。

关于设置的一些说明,我使用Caliburn Micro作为MVVM框架及其INotifyPropertyChanged的实现。我没有使用x:Bind。

尝试1-基于SwipeControl进行控制: 我尝试基于SwipeControl创建一个新控件。我为LeftItemsEnabledInternalLeftItems添加了DepedencyProps。 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();
}

在View中的用法

<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>

ViewModel上ItemsEnabled属性的相同实现。 尝试的问题是转换器从未被击中,并且没有绑定错误。

总而言之,我知道可以通过隐藏代码来设置/重置SwipeItems属性,这在非常简单的情况下是可以的。但是,任何更动态的东西我都无法工作。有其他人遇到这个问题或有解决方法吗?

0 个答案:

没有答案