【问题标题】:Binding Button.IsEnabled to position of current in CollectionView将 Button.IsEnabled 绑定到 CollectionView 中的当前位置
【发布时间】:2013-03-21 13:15:00
【问题描述】:

我正在尝试将按钮的 IsEnabled 属性绑定到窗口的 CollectionViewSource 的属性。我这样做是为了实现 First/Previous/Next/Last 按钮,并希望在视图位于第一项等时禁用 First 和 Previous。

我设置了集合视图源,UI 控件正确绑定到它,可以在代码中访问它的视图,因此点击事件处理程序在浏览视图时可以正常工作。

      <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 path error: '' property not found on 'object' ''ListCollectionView'”

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 尝试将 Source 属性更改为 ElementName。可能是它的帮助。
  • 您在哪里显示数据? DataGrid 或 ...
  • 我不明白如何使用 ElementName,因为集合视图是在窗口资源中声明的,而不是作为可视树的元素。
  • 我在数据网格中显示列表数据,附加文本框显示当前项目的属性,所有这些都与视图中的导航同步。

标签: wpf binding collectionviewsource


【解决方案1】:

您为什么不为此使用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 状态。

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

【讨论】:

  • 感谢 Viv,效果很好。我使用内置命令“LastPage”和“NextPage”搭便车,而不是创建自定义命令“nextButtonCommand”(尽管可能需要更改)。不必做任何事情来使 CanExecuteChanged() 在按钮启用状态下工作。
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2011-02-23
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2014-06-23
  • 2023-03-05
相关资源
最近更新 更多