2017-02-11 58 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" />