2017-02-11 15 views
0

У меня есть DataGrid, который отображает список видов спорта, и я хочу сохранить спорт при изменении свойств IsActive. Как я мог сделать это в стиле MVVM? Я использую среду MVVM Light.Как сохранить элемент из коллекции при изменении свойств?

Это мой DataGrid

  <DataGrid ItemsSource="{Binding SportsList}" AutoGenerateColumns="False" CanUserAddRows="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Foreground="Black" Width="200" Header="Name" Binding="{Binding Name, Mode=TwoWay}" IsReadOnly="True" /> 
       <DataGridCheckBoxColumn Width="60" Header="Is Active" Binding="{Binding IsActive, Mode=TwoWay}" IsReadOnly="False" /> 
      </DataGrid.Columns> 
     </DataGrid> 

Это как вид выглядит модель:

public class MainViewModel : ViewModelBase 
{ 
    private readonly ISportService _sportService; 

    private ObservableCollection<SportModel> sports; 

    public MainViewModel(ISportService sportService) 
    { 
     _sportService = sportService; 
     sports = new ObservableCollection<SportModel>(); 
     LoadSportsCommand = new RelayCommand(LoadSports); 
     SaveSportCommand = new RelayCommand(SaveSport); 
    } 

    public ICommand LoadSportsCommand { get; private set; } 
    public ICommand SaveSportCommand { get; private set; } 

    public ObservableCollection<SportModel> SportsList 
    { 
     get 
     { 
      return sports; 
     } 
    } 

    private void SaveSport() 
    { 
      // Todo 
    } 

    private void LoadSports() 
    { 
     sports.Clear(); 
     foreach (var sport in _sportService.GetAllSports()) 
     { 
      sports.Add(new SportModel() 
      { 
       Name = sport.Name, 
       IsActive = sport.IsActive 
      }); 
     } 
    } 
} 

Это SportModel:

public class SportModel : ObservableObject 
{  
    public string Name { get; set; } 

    public bool IsActive { get; set; } 
} 

ответ

1

Некоторые модификации могут решить проблему:

private void LoadSports() 
{ 
    // ... your code 
    foreach (var r in SportsList) 
     r.PropertyChanged += A_PropertyChanged; 
} 

private void A_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    SaveSport((SportModel)sender); 
} 

private void SaveSport(SportModel sport) 
{ 
    // Todo 
} 

public class SportModel : ObservableObject 
{ 
    public string Name { get; set; } 

    bool _isactive; 
    public bool IsActive 
    { 
     get { return _isactive; } 
     set 
     { 
      if (_isactive != value) 
      { 
       _isactive = value; 
       RaisePropertyChanged("IsActive"); 
      } 
    } 
} 
protected override void RaisePropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    base.RaisePropertyChanged(propertyName); 
} 
} 

И его лучше использовать UpdateSourceTrigger = PropertyChanged в вашем Xaml.

<DataGridCheckBoxColumn Width="60" Header="Is Active" Binding="{Binding IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />