2016-07-12 3 views
1

У меня есть datagrid, который содержит 3 столбца (столбец текстового поля, столбец со списком, столбец флажка), я хотел бы запустить событие , когда в столбце со списком будет выбрано значение, которое будет измените значение столбца флажка соответственно.Связывание данных, событие с измененным свойством

(я не жду его работать так, как код написан, я просто не знаю, как это сделать ..)

, например, в этом коде, когда оценка ниже, чем 90 лет, выбранный в столбце со списком (который привязан к свойству Grade), мне нужно, чтобы значение столбца флажка (которое привязано к свойству GoodStudent) изменилось на false, а когда оно превысило 90, изменилось на true.

если возможно без дополнительных кнопок.

Спасибо.

класс ViewModel:

public class Student : INotifyPropertyChanged 
{ 
    public ObservableCollection<int> Grades { get; set; } 
    private string _Name; 
    public string Name 
    { 
     get 
     { 
      return _Name; 
     } 
     set 
     { 
      _Name = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
     } 
    } 
    private int _Grade; 
    public int Grade 
    { 
     get 
     { 
      return _Grade; 
     } 
     set 
     { 
      _Grade = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Grade")); 
     } 
    } 
    private bool _GoodStudent; 
    public bool GoodStudent 
    { 
     get 
     { 
      return _GoodStudent; 
     } 
     set 
     { 
      _GoodStudent = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("GoodStudent")); 
     } 
    } 
    public Student(string name, int g) 
    { 
     Grades = new ObservableCollection<int> { 30, 40, 90, 100 }; 
     this.Name = name; 
     this.Grade = g; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 
} 
class ViewModel 
{ 
    public ObservableCollection<Student> Students { get; set; } 
    public ViewModel() 
    { 
     Students = new ObservableCollection<Student> 
     { 
      new Student("Dan",80), 
      new Student("Micheal",90) 
     }; 
    } 
} 

XAML:

<Grid> 
    <DataGrid ItemsSource="{Binding Students}" AutoGenerateColumns="False" Margin="69,50,47,66"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}" Header="Names"/> 
      <DataGridComboBoxColumn SelectedValueBinding="{Binding Grade, UpdateSourceTrigger=PropertyChanged}" Header="Grades" Width="80"> 
       <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" Value="{Binding Grades, Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}"/> 
        </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 
      <DataGridCheckBoxColumn Binding="{Binding GoodStudent, UpdateSourceTrigger=PropertyChanged}" Header="IsGood" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
+0

Похоже, вы почти у его (хотя вы могли бы использовать DataTrigger вместо вычисленного собственности), если вы хотите сделать ваш флажок привязки правильно (используйте имя свойства) и установите «GoodStudent», когда оценка была изменена. Что нам не хватает? – BradleyDotNET

+2

изменить 'OnPropertyChanged (новый PropertyChangedEventArgs (« Grade »));' in goodStudent to' OnPropertyChanged (новый PropertyChangedEventArgs («GoodStudent»)); ' – lokusking

+0

спасибо за ваши комментарии, я изменил его сейчас, но все же он не меняет значение 'CheckBoxColumn', когда я вставляю в класс ComboBoxColumn класс выше 90, я хочу, чтобы значение CheckBoxColumn было настроено на' true' автоматически, когда оно было выше. –

ответ

0

Быстрый и грязный раствор:

Я настоятельно рекомендую вам, чтобы переместить Grades из Student и положить его в ViewModel вместо

модель:

public class Student : INotifyPropertyChanged 
    { 
     public ObservableCollection<int> Grades { get; set; } 
     private string _Name; 
     public string Name { 
      get { 
       return _Name; 
      } 
      set { 
       _Name = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
      } 
     } 
     private int _Grade; 
     public int Grade { 
      get { 
       return _Grade; 
      } 
      set { 
       _Grade = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("Grade")); 
       OnPropertyChanged(new PropertyChangedEventArgs("GoodStudent")); 
      } 
     } 
     private bool _GoodStudent; 
     public bool GoodStudent { 
      get { return this.Grade >= 90; } 
     } 
     public Student(string name, int g) 
     { 
      Grades = new ObservableCollection<int> { 30, 40, 90, 100 }; 
      this.Name = name; 
      this.Grade = g; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, e); 
      } 
     } 
    } 

Xaml:

<Grid> 
     <DataGrid ItemsSource="{Binding Students}" AutoGenerateColumns="False" Margin="69,50,47,66"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Name}" Header="Names"/> 
       <DataGridComboBoxColumn SelectedValueBinding="{Binding Grade}" Header="Grades" Width="80"> 
        <DataGridComboBoxColumn.EditingElementStyle> 
         <Style TargetType="{x:Type ComboBox}"> 
          <Setter Property="ItemsSource" Value="{Binding Grades, Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}" /> 
         </Style> 
        </DataGridComboBoxColumn.EditingElementStyle> 
       </DataGridComboBoxColumn> 
       <DataGridCheckBoxColumn Binding="{Binding GoodStudent , UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="IsGood" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
+0

Спасибо! он отлично работает! и я вижу вашу мысль о том, чтобы вывести классы из класса учеников, спасибо большое! –