2013-01-23 101 views
1

我的WPF應用程序包含一個帶有3列和禁用按鈕的DataGrid。 我的DataGrid的一列是DataGridCheckBoxColumn。現在我想綁定Button的IsEnabled -Property,如果至少其中一個選中,則啓用,否則保持禁用狀態。將按鈕綁定到DataGrid內容

其實我已經實現如下:

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

但轉換隻在啓動時調用一次應用。如果DataGrid內容發生更改,或者選中/取消選中CheckBox,則不會有新的調用到我的轉換器。

我該怎麼做?

回答

1

使用MVVM可以很容易:

  1. 聲明一個ICommand屬性與RelayCommand執行按鈕的邏輯。
  2. 您添加的項目必須實現INotifyPropertyChanged接口並具有觸發PropertyChanged事件的布爾IsChecked屬性。
  3. 每次添加新項目時,訂閱其PropertyChanged事件,並在移除時刪除該鉤子。
  4. 每次調用掛鉤方法時,都會爲ICommand屬性啓用PropertyChanged
  5. 在XAML中,只需將按鈕綁定到ICommand屬性即可。

的ViewModels

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"); 
      }     
    } 
+1

使用它有一些小的變化:-)謝謝! – Kooki

1

爲您的按鈕:

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> 
+0

我已經更新了我的問題。我已經嘗試過類似的東西,但沒有爲我工作。 – Kooki

+0

請發佈您的DataGrid代碼。你使用的部分轉換器 – MikroDel

+1

我的答案已更新 – MikroDel

1

你需要不綁定到像格的視覺元素,而是在一定的DependencyProperty,其價值正在發生變化。電網本身通常不會改變,這就是爲什麼轉換器只在啓動時被調用一次的原因。我會創建一個UserControl,它具有帶複選框和按鈕的網格。該UserControl將定義一個類型爲bool的DependencyProperty,當其中一個複選框被選中或取消選中時,它將被設置爲true或false。然後Button的IsEnabled屬性將綁定到該DependencyProperty。

+0

是否有沒有可能創建一個綁定到我的mainwindow.xaml,而不創建一個自己的控制? – Kooki

+0

就目前的設置而言,據我瞭解,我認爲沒有這種可能性。但是我可能錯了,因爲我沒有看到你的代碼。然而,你似乎試圖實現的是綁定到幾個不同的屬性,但這是不可能的。您只能綁定到單個屬性。 – Haspemulator