在WPF中基于数据视图值启用了按钮

时间:2013-08-23 02:04:13

标签: c# wpf datagrid

我有一个绑定到名为Activity的类的数据视图。在网格中有两列,分别是复选框列和文本框。

如果选中至少一个复选框并且其中一个文本框具有某个字符串,我想添加启用按钮的代码。我想在Activity类中创建一个新属性并将其绑定到“isEnabled”属性,但我不确定它是否会起作用,因为没有set方法可以触发NotifyPropertyChanged。

有什么建议吗?

<DataGrid Name="dataGrid" HorizontalAlignment="Center"  CanUserAddRows="False" CanUserReorderColumns="False"  HeadersVisibility="Column" Margin="0,28,0,0" VerticalAlignment="Top" Height="262" AutoGenerateColumns="False" ItemsSource="{Binding Activities}" SelectedItem="{Binding SelectedActivity, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Enabled">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:2)

根据我上面的评论,您可以利用RelayCommand执行此类操作,因为它具有CanExecute函数,该函数自行评估,因此不需要NotifyPropertyChanged事件启用/禁用Button

以下是一个完整的示例,显示此工作,因为它可能有点难以解释

<强>的Xaml:

<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 &amp; 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”)

enter image description here enter image description here