MVVM框架,无法通过修改数据源来修改下拉框选项;无法通过选项修改数据源。
实现如下:
新建一个WinForm .NetFramework工程,放置一个ComboBox、Label、Button,窗体如下:
将ViewModel,Model<ComboBoxModel类写在Form1.cs里.
ComboBox的DataSource是LIst<ComboBoxModel>,SelectedItem是ComboBoxModel.
理想效果是,下拉框选中项改变后,同步改变Label的内容;点击按键可更换下拉框可选项。
实际效果是,下拉框选中项改变后,不可改变Label的内容;点击按键会清空下拉框可选项。
记录该问题,有大佬懂的求教一下,谢谢。
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.ComponentModel;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public class ComboBoxModel
{
public string Value { get; set; }
public int Index { get; set; }
public ComboBoxModel( int index,string value)
{
Value = value;
Index = index;
}
}
public class Model
{
public List<ComboBoxModel> Items { get; set; }
public ComboBoxModel SelectItem { get; set; }
}
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private Model model;
public ViewModel()
{
model = new Model();
Items = new List<ComboBoxModel>();
Items.Add(new ComboBoxModel(1,"a"));
Items.Add(new ComboBoxModel(2, "b"));
Items.Add(new ComboBoxModel(3, "c"));
SelectItem = Items[0];
}
public List<ComboBoxModel> Items
{
get { return model.Items; }
set { model.Items = value; OnPropertyChanged("Items"); }
}
public ComboBoxModel SelectItem
{
get { return model.SelectItem; }
set { model.SelectItem = value; OnPropertyChanged("SelectItem"); }
}
public string temp
{
get { return model.SelectItem.Value; }
}
}
private ViewModel viewModel=new ViewModel();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataBindings.Add("DataSource", viewModel, "Items");
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Index";
comboBox1.DataBindings.Add("SelectedItem", viewModel, "SelectItem");
label1.DataBindings.Add("Text", viewModel, "temp");
}
/// <summary>
/// 刷新下拉框选项
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
viewModel.Items = new List<ComboBoxModel>();
viewModel.Items.Add(new ComboBoxModel(4, "d"));
viewModel.Items.Add(new ComboBoxModel(5, "e"));
viewModel.Items.Add(new ComboBoxModel(6, "f"));
}
}
}