根据我上面的评论,您可以利用RelayCommand它来执行这种操作,因为它具有CanExecute自行评估的功能,因此不需要NotifyPropertyChanged事件来启用/禁用Button
这是一个完整的例子,展示了这个工作,因为它可能有点难以解释
xml:
<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="315" Width="258" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <DataGrid Name="dataGrid" CanUserAddRows="False" CanUserReorderColumns="False"  HeadersVisibility="Column"  AutoGenerateColumns="False" ItemsSource="{Binding Activities}" SelectedItem="{Binding SelectedActivity, Mode=TwoWay}" Margin="10,10,10,37" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column1" Binding="{Binding Column1}" />
                <DataGridTemplateColumn Header="Enabled">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Command="{Binding MyButtonCommand}" Content="Is any checked & is any 'Item6' " Margin="10,0,9,10" Height="22" VerticalAlignment="Bottom"/>
    </Grid>
</Window>
代码:
namespace WpfApplication8
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<TestObject> myVar = new ObservableCollection<TestObject>();
        public MainWindow()
        {
            MyButtonCommand = new RelayCommand(ExecuteButtonAction, CanButtonExecute);
            InitializeComponent();
            for (int i = 0; i < 100; i++)
            {
                Activities.Add(new TestObject { Column1 = "Item" + i, Enabled = false });
            }
        }
        public ICommand MyButtonCommand { get; set; }
        public ObservableCollection<TestObject> Activities
        {
            get { return myVar; }
            set { myVar = value; }
        }
        private bool CanButtonExecute()
        {
            return Activities.Any(x => x.Enabled) && Activities.Any(x => x.Column1 == "Item2");
        }
        private void ExecuteButtonAction()
        {
            // button clicked
        }
    }
    public class TestObject : INotifyPropertyChanged
    {
        private string _column1;
        private bool _enabled;
        public string Column1
        {
            get { return _column1; }
            set { _column1 = value; NotifyPropertyChanged(); }
        }
        public bool Enabled
        {
            get { return _enabled; }
            set { _enabled = value; NotifyPropertyChanged(); }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged([CallerMemberName]string propertyName = null)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    public class RelayCommand : ICommand
    {
        private readonly Action _execute;
        private readonly Func<bool> _canExecute;
        /// <summary>
        /// Creates a new command that can always execute.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        public RelayCommand(Action execute)
            : this(execute, null)
        {
        }
        /// <summary>
        /// Creates a new command.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        /// <param name="canExecute">The execution status logic.</param>
        public RelayCommand(Action execute, Func<bool> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");
            _execute = execute;
            _canExecute = canExecute;
        }
        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute();
        }
        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested += value;
                }
            }
            remove
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested -= value;
                }
            }
        }
        public void Execute(object parameter)
        {
            _execute();
        }
    }
}
结果:(是否检查了任何项目并且是任何项目“Item6”)
 
 