我正在尝试使用Microsoft的新SwipeControl
,以允许用户显示该项目可用的操作。我正在努力的是在操作不再可用时删除SwipeItems
,我知道可以在LeftItems
上设置SwipeControl
属性并使其无效为预期的效果,但是我需要它比这更具动态性。
关于设置的一些说明,我使用Caliburn Micro作为MVVM框架及其INotifyPropertyChanged的实现。我没有使用x:Bind。
尝试1-基于SwipeControl
进行控制:
我尝试基于SwipeControl
创建一个新控件。我为LeftItemsEnabled
和InternalLeftItems
添加了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
属性,这在非常简单的情况下是可以的。但是,任何更动态的东西我都无法工作。有其他人遇到这个问题或有解决方法吗?