2015-04-09 2 views
2

Я привязываю DataGrid к списку, у которого есть свойство boolen «IsSelected».WPF DataGrid SelectAll Флажок с двусторонней привязкой

public partial class MainWindow : Window 
{ 
    List<BaselineEntity> _blRecs; 

    public MainWindow() 
    { 
    InitializeComponent(); 

    _blRecs = new List<BaselineEntity>(); 

    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_1", IsSelected = false}); 
    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_2", IsSelected = false}); 
    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_2", IsSelected = false}); 

    ChangedBlRecsGridView.ItemsSource = _blRecs; 
    } 
} 

Если класс BaselineEntity определяется как:

internal class BaselineEntity 
{ 
    public string EntityId {get; set;} 
    public bool IsSelected { get; set; } 
} 

Часть XAML это

<DataGrid Name="ChangedBlRecsGridView" 
      ItemsSource="{Binding _blRecs, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Entity Id" Binding="{Binding EntityId}"></DataGridTextColumn> 

     <DataGridTemplateColumn Width="30"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.Header> 
       <CheckBox Name="chkSelectAll" Checked="chkSelectAll_Checked" Unchecked="chkSelectAll_Unchecked"></CheckBox> 
      </DataGridTemplateColumn.Header> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Где обработчики событий для проверяемых и непроверяемых событий Select-All флажком являются например:

private void chkSelectAll_Checked(object sender, RoutedEventArgs e) 
{ 
    foreach (BaselineEntity enty in ChangedBlRecsGridView.ItemsSource) 
    { 
     enty.IsSelected = true; 
    } 
} 

private void chkSelectAll_Unchecked(object sender, RoutedEventArgs e) 
{ 
    foreach (BaselineEntity enty in ChangedBlRecsGridView.ItemsSource) 
    { 
      enty.IsSelected = false; 
    } 
} 

Я знаком с MVVM, и я знаю, что не придерживался каких-либо лучших практик (например, внедрение viewModel), потому что я только начинаю работу с WPF.

Check and Uncheck обработчики событий устанавливают и возвращают свойство IsSelected, но представление НЕ обновляется об этом изменении. Похоже, что предполагаемое двухстороннее связывание каким-то образом не происходит.

Я предполагаю, что я должен был реализовать класс BaselineEntity с некоторым интерфейсом, чтобы нажимать уведомления на представление (это то, что я ожидал бы от своих нескольких рабочих знаний о нокауте js, но не смог найти, что это после расходование часов).

Я не знаю, что я здесь отсутствует. Я просто не мог найти, что может быть решением.

Любая помощь/руководство ценится ..

Спасибо!

+1

Вы не выполнили INotifyPropertyChanged в BaselineEntity. –

ответ

2

см ниже код модели с INotifyPropertyChanged

internal class BaselineEntity:INotifyPropertyChanged 
{ 
    public string EntityId { get; set; } 

    private bool isSelected; 

    public bool IsSelected 
    { 
     get { return isSelected; } 
     set { isSelected = value; OnPropertyChanged("IsSelected"); } 
    } 

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

Спасибо человеку .. Я только что получил ответ от кого-то в чате. Я искал реализацию INotifyPropertyChanged .. но благодаря вам, я получил свой полный код .. :) –