如何在属性更改时保存集合中的项



我有一个显示运动列表的数据网格,我想在 IsActive 属性更改时保存运动。我怎样才能以 MVVM 风格做到这一点?我正在使用MVVM Light框架。

这是我的数据网格

         <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
            });
        }
    }
}

这是运动模型:

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

一些修改可以解决这个问题:

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);
 }
}

最好在 Xaml 中使用 UpdateSourceTrigger=PropertyChanged

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

最新更新