【问题标题】:MVVM model properties VS viewmodel properties combobox bindingMVVM 模型属性 VS 视图模型属性组合框绑定
【发布时间】:2021-06-04 08:02:28
【问题描述】:

我在绑定到组合框时有奇怪的行为,但是当我在线搜索时,我所做的应该可以工作......我想。我是 WPF 和绑定东西的菜鸟……我对此只有一些基本的了解。

所以基本上我有 2 个组合框来显示 COM 端口和波特率,我想将两个东西绑定到它们,Itemsource 和 SelectedValue,因为我想显示东西,当我选择一些东西时,我想在某处有选定的字符串.

两个组合框的奇怪行为不同...

使用我想显示波特率的组合框,我在构造函数 {9600、19200 等...} 中生成一个字符串列表。绑定适用于应用程序启动时,我看到组合框中的值。出于测试和学习的目的,我创建了一种方法,可以将另一个值添加到列表中。通常,新添加的字符串也应该显示在组合框中,因为它已绑定并且我实现了 INotifyPropertyChanged。发生的事情很奇怪,当应用程序加载时,绑定工作,如果我点击组合框,我会看到我在构造函数中添加的所有字符串。然后,如果我单击按钮将字符串添加到列表中,然后再次单击组合框,则不会显示新值。但是在应用程序启动时,如果我没有触摸组合框并单击按钮添加字符串,然后单击组合框,它会显示新添加的字符串。问题是从我点击组合框的那一刻起,新添加的字符串就不再显示了。

对于我想要显示 COM 端口名称的组合框,除非我直接在视图模型中使用 List 属性,否则不会显示任何内容。如果我公开一个包含我要使用的属性的类,它就不起作用。就像如果我不使用 PortName.DropdowList 而不是使用属性 Names ,它是视图模型中的一个直接列表,当 Refreshport 方法运行它时,COMX 会显示在组合框中,但不是我的自定义类。

最后这两者可能是相同的问题,因为我以相同的方式绑定它们,但使用视图模型中的属性不同...

感谢您的见解。

在代码中查看:

组合框的模型类:

public class Combobox
{
    public Combobox()
    {
        
    }
    public Combobox(List<string> list)
    {
        DropdownList = list;
    }

    public List<string> DropdownList { get; set; }
    public string SelectedItemString { get; set; }
}

ViewModel 类:

    public class MainWindowViewModel : BaseViewModel
{
    SerialPort SerialPort = new SerialPort();
    
    public MainWindowViewModel()
    {
        this.RefreshPortCommand = new RefreshPortCommand(this);

        this.Baudrate = new Combobox(new List<string>() { "9600", "19200", "38400", "57600", "115200" });
        this.PortName = new Combobox();
        this.Rates = new List<string>() { "9600", "19200", "38400", "57600", "115200" };
        this.Names = new List<string>();
    }

    /// <summary>
    /// Command property declarations
    /// </summary>
    public RefreshPortCommand RefreshPortCommand { get; set; }
    public OpenPortCommand OpenPortCommand { get; set; }
    public THC4BootloaderCommand THC4BootloaderCommand { get; set; }
    #region Properties
    /// <summary>
    /// property declaration format with INotifyPropertyChanged
    /// </summary>
    private int myVar;
    public int MyProperty
    {
        get { return myVar; }
        set
        {
            myVar = value;
            RaisePropertyChanged("MyProperty");
        }
    }
    private List<string> _Names;

    public List<string> Names
    {
        get { return _Names; }
        set
        {
            _Names = value;
            RaisePropertyChanged("Names");
        }
    }

    private string _SelectedRate;

    public string SelectedRate
    {
        get { return _SelectedRate; }
        set
        {
            _SelectedRate = value;
            RaisePropertyChanged("SelectedRate");
        }
    }

    private List<string> _Rates;

    public List<string> Rates
    {
        get { return _Rates; }
        set
        {
            _Rates = value;
            RaisePropertyChanged("Rates");
        }
    }

    private Combobox _Baudrate;
    public Combobox Baudrate
    {
        get { return _Baudrate; }
        set
        {
            _Baudrate = value;
            RaisePropertyChanged("Baudrate");
        }
    }


    private Combobox _PortName;

    public Combobox PortName
    {
        get { return _PortName; }
        set
        {
            _PortName = value;
            RaisePropertyChanged("PortName");
        }
    }

    #endregion


    /// <summary>
    /// Method 
    /// </summary>

    public void RefreshPorts()
    {
        Baudrate.DropdownList.Add("12345");
        PortName.DropdownList = SerialPort.GetPortNames().ToList();
    }
}

XAML:

<ComboBox Width="100"
          ItemsSource="{Binding PortName.DropdownList}"
          SelectedValue="{Binding PortName.SelectedItemString, Mode=OneWayToSource}"
          SelectedIndex="0"/>

<ComboBox Width="100" 
          ItemsSource="{Binding Baudrate.DropdownList}"
          SelectedValue="{Binding Baudrate.SelectedItemString, Mode=OneWayToSource}"
          SelectedIndex="2"/>

【问题讨论】:

    标签: mvvm combobox binding


    【解决方案1】:

    您需要使用ObservableCollection&lt;T&gt; 而不是List&lt;T&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多