MVVM模型属性VS视图模型属性组合框绑定



我有奇怪的行为绑定到组合框,但当我在网上搜索,我所做的应该工作…我认为。我是WPF和绑定方面的呆子…我对此只有一些基本的了解。

基本上我有两个组合框来显示COM端口和波特率我想把两个东西绑定到它们上,Itemsource和SelectedValue,因为我想显示东西当我选择某个东西时我想把选中的字符串放在某个地方

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

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

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

最后可能是同样的问题,因为我绑定他们相同的方式,但使用属性在视图模型不同…

谢谢你的见解。

查看代码:

组合框的Model类:

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"/>

您需要使用ObservableCollection<T>而不是List<T>

最新更新