how to pass property value to property of another class in wpf mvvm

后端 未结 2 1988
南旧
南旧 2021-01-28 23:38

I want to pass SecondViewModel SecondProperty value to ViewModel myProperty and show the value on TextBlock. i want the codi

相关标签:
2条回答
  • 2021-01-29 00:23

    From your comment, assuming that ViewModel holds a collection of SecondViewModel items, you need to set the PropertyChangedEvent for each instance of SecondViewModel to trigger ViewModel.myProperty to refresh. e.g. ...

    public class ViewModel
    {
        private List<SecondViewModel> _secondViewModels = new List<SecondViewModel>();
    
        public IEnumerable<SecondViewModel> SecondViewModels => _secondViewModels;
    
        public int myProperty => _secondViewModels.Sum(vm => vm.SecondProperty);
    
        public void AddSecondViewModel(SecondViewModel vm)
        {
            _secondViewModels.Add(vm);
            vm.PropertyChanged += (s, e) => OnPropertyChanged(nameof(myProperty));
            OnPropertyChanged(nameof(myProperty));
        }
    }
    

    As an aside, you should never call OnPropertyChanged() with a "magic string" - use nameof() instead.

    0 讨论(0)
  • 2021-01-29 00:26

    If you need that, you should create a VM DataSource to create a dependency in your first VM.

    public class YourViewModelDataSource
     {
    
    private ViewModel viewModel;
    private SecondViewModel secondViewModel;
    
    public YourViewModelDataSource(ViewModel viewModel, SecondViewModel secondViewModel)
        {
          this.viewModel = viewModel;
          this.secondViewModel = secondViewModel;
        }
    
    public void CreateDataSource()
        {
          this.secondViewModel.PropertyChanged += this.OnSecondViewModelPropertyChanged;
        }
    
    private void OnSecondViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                switch (e.PropertyName)
                {
                    //As pointed in comments, you need to have the second property in your first ViewModel then do this.
                    case "SecondProperty":
                        this.viewModel.myProperty = this.secondViewModel.SecondProperty;
                        break;
                }
            }
      }
    

    When you create your VMs then use this class to create the dependency. Every time SecondViewModel SecondProperty changes, the ViewModel myProperty will be raised. I hope it's clear, let me know if you need something else

    0 讨论(0)
提交回复
热议问题