我正在尝试将按钮的 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/