Я создал 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: Невозможно получить NodePath для ViewNode, который не является частью дерева представления.
У кого-нибудь есть лучшее решение?Может быть, я пытаюсь убить муху с помощью пушки здесь.:)
Заранее спасибо.Эдуардо Мело