2013-03-31 2 views
2

Я пытаюсь привязать свойство IsEnabled кнопки к свойствам CollectionViewSource окна. Я делаю это для реализации кнопок «Первая/Предыдущая/Следующая/Последняя» и хочу, чтобы первая и предыдущая были отключены, когда представление относится к первому элементу и т. Д.Binding Button.IsEnabled to position of current в CollectionView

У меня есть источник источника коллекции, пользовательский интерфейс связывается с это правильно, с доступом к его представлению в коде, поэтому обработчики событий кликов прекрасно работают при навигации по представлению.

 <CollectionViewSource x:Key="cvMain" /> 

DockPanel является корневым элементом окна

<DockPanel DataContext="{StaticResource cvMain}"> 

FoJobs является наблюдаемой коллекцией, cvJobs является CollectionView, который я использую в обработчик щелчка данной кнопки

private void Window_Loaded(object sender, RoutedEventArgs e) { 
    ((CollectionViewSource)Resources["cvMain"]).Source = FoJobs; 
    cvJobs = (CollectionView)((CollectionViewSource)Resources["cvMain"]).View; 
} 

У меня есть попробовал это, но получил ошибку привязки «Ошибка пути BindingExpression:« Свойство не найдено в «объекте» '' ListCollectionView ''

 <Button Name="cbFirst" Click="cbMove_Click" IsEnabled="{Binding Source={StaticResource cvMain}, Converter={StaticResource CurrPos2BoolConverter}}" /> 

Я пытаюсь сделать с конвертером сначала, но рисунок стиля с триггерами будет более эффективным, но не может получить доступ к представлению коллекции. Несмотря на то, что базовый datacontext установлен в источник представления коллекции, привязка передается в конвертер в качестве источника представления (если я не эксплицирован, установите источник привязки, как указано выше), который не имеет валютных свойств (CurrentPosition, Count и т. Д.).

Любая помощь была бы принята с благодарностью.

+0

попытайтесь изменить атрибут Source на ElementName. Может быть, его помощь. – stukselbax

+0

Где вы показываете данные? 'DataGrid' или ... –

+0

Я не понимаю, как я могу использовать ElementName, поскольку представление коллекции объявляется в ресурсах окна, а не как элемент визуального дерева. –

ответ

2

Почему вы не используете для этого RoutedCommand (даже если вы не используете MVVM)?

сказать что-то вроде:

<Button x:Name="nextButton" 
     Command="{x:Static local:MainWindow.nextButtonCommand}" 
     Content="Next Button" /> 

и в коде-за:

public static RoutedCommand nextButtonCommand = new RoutedCommand(); 

public MainWindow() { 
    InitializeComponent(); 
    CommandBinding customCommandBinding = new CommandBinding(
    nextButtonCommand, ExecuteNextButton, CanExecuteNextButton); 
    nextButton.CommandBindings.Add(customCommandBinding); // You can attach it to a top level element if you wish say the window itself 
} 

private void CanExecuteNextButton(object sender, CanExecuteRoutedEventArgs e) { 
    e.CanExecute = /* Set to true or false based on if you want button enabled or not */ 
} 

private void ExecuteNextButton(object sender, ExecutedRoutedEventArgs e) { 
    /* Move code from your next button click handler in here */ 
} 

Вы также можете применить одно из предложений от Explicitly raise CanExecuteChanged() вручную повторно оценить Button.isEnabled состояние.

Таким образом, ваша инкапсулирующая логика связана с кнопкой в ​​одной области.

+0

Спасибо Viv, что сработало отлично. Я собрал команды со встроенными командами «LastPage» и «NextPage», вместо того, чтобы создавать пользовательскую команду «nextButtonCommand» (хотя это может потребоваться изменить). Не нужно было ничего делать, чтобы CanExecuteChanged() работал с включенным состоянием кнопок. –