【问题标题】:Bind Button to DataGrid Content将按钮绑定到 DataGrid 内容
【发布时间】:2013-01-23 12:50:16
【问题描述】:

我的 WPF 应用程序包含一个具有 3 列和一个禁用按钮的 DataGrid。 我的 DataGrid 的一列是DataGridCheckBoxColumn。现在我想绑定 Button 的 IsEnabled-Property,如果其中至少一个被选中,则启用,否则保持禁用。

其实我有以下实现:

<Button x:Name="buttonStart" Content="Start" IsEnabled="{Binding Converter={StaticResource ButtonEnableConverter}, ElementName=gridTestCaseChooser}" />

但转换器仅在应用程序启动时调用一次。如果 DataGrid 内容发生更改,或者我选中/取消选中 CheckBox,则不会对我的转换器进行新调用。

我该怎么做?

【问题讨论】:

    标签: c# wpf data-binding datagrid


    【解决方案1】:

    使用MVVM 非常简单:

    1. 声明一个ICommand 属性以使用RelayCommand 执行按钮的逻辑。
    2. 您添加的项目必须实现INotifyPropertyChanged 接口并具有触发PropertyChanged 事件的bool IsChecked 属性。
    3. 每次添加新项目时,订阅其PropertyChanged 事件,删除时,也删除挂钩。
    4. 每次调用挂钩方法时,为 ICommand 属性触发 PropertyChanged
    5. 在 XAML 中,只需将按钮绑定到 ICommand 属性即可。

    视图模型

        public class Item: INotifyPropertyChanged
        {
            private bool isChecked;
            public event PropertyChangedEventHandler PropertyChanged;
            public bool IsChecked
            {
                get
                {
                    return this.isChecked;
                }
                set
                {
                    this.isChecked = value;
                    var propertyChangedEvent = PropertyChanged;
                    if(propertyChangedEvent != null)
                    {
                        propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething");
                    }                
                }
            }
        }
    
        public class MyViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public ICommand UpdateSomething { get; private set; }
            public ObservableCollection<Item> MyItems { get; set; }
    
            public MyViewModel()
            {
                UpdateSomething = new RelayCommand(MyCommandExecute, MyCommandCanExecute);
                MyItems = new ObservableCollection<Item>();
            }
    
            private void MyCommandExecute(object parameter)
            {
                // Your logic here.
            }
    
            private void MyCommandCanExecute(object parameter)
            {
                return MyItems.Any(item => item.IsChecked);
            }
    
            private void AddItem(Item item)
            {
                item.PropertyChanged += ItemsPropertyChanged;
                MyItems.Add(item);
            }
    
            private void ItemsPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                var propertyChangedEvent = PropertyChanged;
                if(propertyChangedEvent != null &&
                   e.PropertyName == "IsChecked")
                {
                    propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething");
                }                
        }
    

    【讨论】:

    • 用它做了一些小改动 :-) 谢谢!
    【解决方案2】:

    你需要绑定的不是像网格这样的可视元素,而是一些 DependencyProperty,它的值正在改变。电网本身通常不会改变,这就是为什么转换器在启动时只被调用一次。我将创建一个 UserControl,它具有带有复选框和按钮的网格。 userControl将定义类型BOOL的依赖项Property,当检查或未选中其中一个复选框时,将设置为true或false。然后 Button 的 IsEnabled 属性将绑定到该 DependencyProperty。

    【讨论】:

    • 是否有可能在不创建自己的控件的情况下创建绑定到我的 mainwindow.xaml 中?
    • 根据您目前的设置,据我了解,我认为没有这种可能性。但我可能错了,因为我没有看到你的整个代码。但是,您似乎想要实现的是绑定到几个不同的属性,但这是不可能的。您只能绑定到单个属性。
    【解决方案3】:

    为您的按钮:

       IsEnabled="{Binding ElementName=NN, Path=IsChecked}">
    

    问题更新后更新

    这里讨论了您遇到的相同情况: What causes a Value Converter to fire?

    这个想法是选择真正改变自己状态的东西

    更新

    试试这样的:

    <dg:DataGrid.Columns> 
       <dg:DataGridTextColumn Header="First Name" Width="50">  
          <dg:DataGridTextColumn.DataFieldBinding> 
             <Binding Path="FirstName" /> 
          </dg:DataGridTextColumn.DataFieldBinding> 
        </dg:DataGridTextColumn> 
        <dg:DataGridCheckBoxColumn Header="Active" Width="50" DataFieldBinding="{Binding Path= IsActive}" /> 
    </dg:DataGrid.Columns> 
    

    【讨论】:

    • 我已经更新了我的问题。我已经尝试过类似的方法,但对我没有用。
    • 请为您发布 DataGrid 的代码。使用 Converter 的部分
    • 那我应该怎么选,绑定一行的checked状态而不是洞DataGrid呢?
    猜你喜欢
    • 2011-05-22
    • 2018-09-03
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2015-03-27
    • 2018-10-24
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多