【问题标题】:How to save the item from the collection when property changes?属性更改时如何保存集合中的项目?
【发布时间】:2017-02-11 09:07:34
【问题描述】:

我有一个显示运动列表的 DataGrid,我想在 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
            });
        }
    }
}

这是 SportModel:

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

    public bool IsActive { get; set; }
}

【问题讨论】:

    标签: c# .net wpf mvvm mvvm-light


    【解决方案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);
     }
    }
    

    最好在您的 Xaml 中使用 UpdateSourceTrigger=PropertyChanged

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

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2011-09-30
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多