【发布时间】: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"/>
【问题讨论】: