绑定ViewModel列表在c# Windows通用应用程序中的列表框

本文关键字:列表 应用程序 Windows ViewModel 绑定 | 更新日期: 2023-09-27 17:50:29

我有一个列表框,我想得到更新时,项目被添加到一个列表。我知道我需要绑定列表框。我在努力理解这个问题/答案。

我有一个ViewModel处理列表:

namespace TESTS
{
public class ViewModel : INotifyPropertyChanged
{
    private List<Cars> _listCars;
    public List<Cars> listCars
    {
        get
        {
            return _listCars;
        }
        set
        {
            if (_listCars == value)
            {
                return;
            }
            this.RaisePropertyChanged("Message");
            _listCars = value;
            this.RaisePropertyChanged("Message");
        }
    }
   public ViewModel()
    {
        listCars = new List<Cars>();
    }
    protected void RaisePropertyChanged(string propertyName)
    {
        Debug.WriteLine("Property Changed");
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
}

下面是Cars类:

public class Cars: INotifyPropertyChanged
{
    public string model{ get; set; }
    public string year{ get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

我将listbox绑定到Viewmodel中的属性路径也就是listCars。

<ListBox .... ItemsSource="{Binding listCars}">

在main。example。cs。我点击按钮并添加项目。它不会被添加到列表框,即使它绑定到视图模型上的列表。

public sealed partial class MainPage : Page
{
    public static ViewModel vm = new ViewModel();
    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = vm;            
    }
    private void button_Click(object sender, RoutedEventArgs e)
    {
        Cars x = new Cars();
        x.model = "Ford";
        x.Year = "1998";
        vm.listCars.Add(x);
    }
}
我希望我已经很好地解释了我实现的东西。在我的实现ViewModel有什么问题。我是MVVM的新手。请帮助。

绑定ViewModel列表<T>在c# Windows通用应用程序中的列表框

  1. 使用ObservableCollection<T>,而不是List<T>。前者是为与MVVM一起使用而设计的,后者则不是。你会自动收到所有通知。这对于List<T>是可行的,但是你将不得不编写更多的代码,并且性能将更差,特别是对于大型集合。

  2. 如果你在构造函数中创建集合,将它赋值为只读属性,并且从不改变它的实例(这是你应该做的),你甚至不需要实现INPC

  3. 在实现INPC时,您应该在更改属性后调用RaisePropertyChanged,一次,并且使用已更改的属性名称,而不是随机的不相关字符串。