wpf - 将 Button.IsEnabled 绑定(bind)到 CollectionView 中当前的位置

标签 wpf binding collectionviewsource

我正在尝试将按钮的 IsEnabled 属性绑定(bind)到窗口的 CollectionViewSource 的属性。我这样做是为了实现“第一个/上一个/下一个/最后一个”按钮,并希望当 View 位于第一个项目等时禁用“第一个”和“上一个”。

我设置了 Collection View 源,UI 控件正确绑定(bind)到它,并可以在代码中访问其 View ,以便单击事件处理程序在 View 中导航时可以正常工作。

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

我已经尝试过此操作,但收到绑定(bind)错误“BindingExpression 路径错误:'' 在 'object' ''ListCollectionView' 上找不到属性”

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

我尝试首先使用转换器,但认为带有触发器的样式会更有效,但无法访问 Collection View 。即使底层数据上下文设置为 Collection View 源,绑定(bind)也会作为 View 源传递给转换器(如果我没有明确设置绑定(bind)的源,如上所述),它没有货币属性(CurrentPosition、Count 等)。

任何帮助将不胜感激。

最佳答案

为什么不使用 RoatedCommand 来实现此目的(即使您不使用 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 状态。

这样您就可以将与按钮相关的逻辑封装在一个区域中。

关于wpf - 将 Button.IsEnabled 绑定(bind)到 CollectionView 中当前的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726920/

相关文章:

c# - 如何在已排序的 silverlight TreeView 中维护当前选择?

c# - 来自 MemoryStream 的 UWP BitmapImage SetSource 挂起

windows - 在 Windows 中为套接字使用特定的网络接口(interface)

c# - CollectionViewSource 代码隐藏绑定(bind) MVVM 的奇怪行为

c# - 如何制作只读的 ObservableCollection 属性?

c# - 基于多个条件的 WPF 绑定(bind)

wpf - 将 XAML 定义的 CollectionViewSource 绑定(bind)到 ViewModel

c# - 无法更改 WPF 菜单的背景颜色

c# - 在 WPF 应用程序中加载非托管 DLL

c# - WPF 功能区以编程方式折叠和展开