我创建了一个 UserControl 用作数据导航器。我在此控件中定义了两个 DependencyProperties,如下所示(隐含 DependencyProperty):
public ICollection DataCollection
{
get { return GetValue(DataCollectionProperty) as ICollection; }
set { SetValue(DataCollectionProperty, value); }
}
public ICollectionView View
{
get { return (DataCollection == null ? null : CollectionViewSource.GetDefaultView(DataCollection)); }
}
然后,我放置了四个按钮来执行基本的导航操作(第一个、上一个、下一个、最后一个)。每个按钮都有以下样式:
<Style x:Key="NavButtonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataCollection}" Value="{x:Null}">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
这个触发器所做的就是检查 DataCollection DependencyProperty 是否为空,假设将 RelativeResource TemplatedParent 作为每个按钮的 DataContext 传递,如下所示:
<Button (...) DataContext="{RelativeSource TemplatedParent}">
然后我创建了以下 MarkupExtension 来比较值并根据比较操作和比较值返回 true 或 false:
[MarkupExtensionReturnType(typeof(bool))]
public class ComparisonBinding : BindingDecoratorBase
{
public ComparisonOperation Operation { get; set; }
public object Comparand { get; set; }
public override object ProvideValue(IServiceProvider provider)
{
base.ProvideValue(provider);
DependencyObject targetObject;
DependencyProperty targetProperty;
bool status = TryGetTargetItems(provider, out targetObject, out targetProperty);
if (status && Comparand != null)
{
if (Comparand is MarkupExtension)
Comparand = (Comparand as MarkupExtension).ProvideValue(provider);
return Compare(targetObject.GetValue(targetProperty), Comparand, Operation);
}
return false;
}
private static bool Compare(object source, object target, ComparisonOperation op)
}
最后,我用这个 ME 测试了每个按钮的“启用”条件。这是第一个按钮的条件:
<Button (...) DataContext="{RelativeSource TemplatedParent}"
IsEnabled="{DynamicResource {mark:ComparisonBinding Path=View.CurrentPosition, RelativeSource={RelativeSource TemplatedParent}, Comparand={Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataCollection.Count}, Operation=EQ}}">
不幸的是,这个解决方案没有奏效。我不断收到这个设计时异常:
InvalidOperationException:无法获取不属于视图树的 ViewNode 的 NodePath。
有没有人有更好的解决方案?也许我想在这里用大炮杀死一只苍蝇。:)
提前致谢。爱德华多·梅洛