2014-01-13 35 views
-1

我使用一個DataGrid有一個複選框,我想將其綁定到一個名爲Part類:WPF數據綁定的複選框失敗DataGrid中

public class Part 
{ 
    public bool DoImport { get; set; } 
} 

我的窗前,WPF是:

<Window x:Class="CompareWindow"> 
    <Grid> 
     <DataGrid x:Name="CompareGrid" ItemsSource="{Binding}" > 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Header="Import" Width="100" IsReadOnly="False" Binding="{Binding Path=DoImport, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Button x:Name="SelectAllBtn" Content="Select All" Click="SelectAllButton_Click"/> 
    </Grid> 
</Window> 

在有我使用一個名爲Select All的按鈕,它應該點擊時一次檢查所有複選框:

public partial class CompareWindow : Window, INotifyPropertyChanged { 
    public CompareWindow(Part somePart) { 
     _changedParts = new ObservableCollection<Part>(); 
     _changedParts.Add(somePart); 
     CompareGrid.DataContext = _changedParts; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string name) { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    private void SelectAllButton_Click(object sender, RoutedEventArgs e) { 
     ChangedParts.ToList().ForEach(x => x.DoImport = true); 
    } 

    private ObservableCollection<Part> _changedParts; 
    public ObservableCollection<Part> ChangedParts { 
     get { return _changedParts; } 
     set { 
      _changedParts = new ObservableCollection<Part>(); 
      foreach (var part in value) { 
       _changedParts.Add(part); 
      }       
      OnPropertyChanged("ChangedParts"); 
     } 
    } 
} 

但是當我點擊按鈕時沒有任何反應。爲什麼?

回答

2

您需要在包含DoImport屬性的類中實現INotifyPropertyChanged

private bool doImport; 
public bool DoImport 
{ 
    get { return doImport; } 
    set 
    { 
     doImport = value; 
     this.OnPropertyChanged("DoImport"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

protected void OnPropertyChanged(string propertyName) 
{ 
    if (this.PropertyChanged != null) 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 
+1

Holy'INotifyPropertyChanged' :) – Tico