gpt4 book ai didi

c# - 如何为数据绑定(bind)组合框预定义组合框项目?

转载 作者:行者123 更新时间:2023-11-30 20:58:59 24 4
gpt4 key购买 nike

我想让用户选择串口的波特率。我创建了一个与串口波特率绑定(bind)的文本框,如下所示,它可以工作。

<TextBox x:Name="tbbaudRate" Text="{Binding SerialPort.BaudRate}" />

我的问题是,有效波特率的集合有限。有效波特率为 { 75、110、300、1200、2400、4800、9600、19200、38400、57600、115200 }。我想将文本框更改为列出有效波特率值的组合框。

这是我做的。

<ComboBox x:Name="tbbaudRate" Text="{Binding SerialPort.BaudRate}" >
<ComboBoxItem Content="75"/>
<ComboBoxItem Content="110"/>
<ComboBoxItem Content="300"/>
<ComboBoxItem Content="1200"/>
<ComboBoxItem Content="2400"/>
<ComboBoxItem Content="4800"/>
<ComboBoxItem Content="9600"/>
<ComboBoxItem Content="19200"/>
<ComboBoxItem Content="38400"/>
<ComboBoxItem Content="57600"/>
<ComboBoxItem Content="115200"/>
</ComboBox>

虽然这行得通,但我遇到的问题很少。

  1. 当我第一次加载窗口时,未选择波特率的默认值 (9600)。

  2. 这看起来不太优雅。实现此目标的最佳方法是什么?

作为引用,这是我的串口类。也像上面的代码一样丑陋。我使用 resharper 自动生成 notifypropertychange 代码。

class SerialComm : INotifyPropertyChanged
{
private int[] ValidBaudRate = new[] { 75, 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 }; //Dont know how to use this
private int[] ValidDataBits = new[] { 5, 6, 7, 8, 9 }; //Dont know how to use this

private SerialPort _serialPort;

public SerialComm()
{
_serialPort = new SerialPort();
}

public SerialPort SerialPort
{
get { return _serialPort; }
set
{
_serialPort = value;
OnPropertyChanged("SerialPort");
SerialPort.GetPortNames();
}
}

#region Autogenerate by resharper
public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}

最佳答案

像这样更改组合框:

<ComboBox  Name="comboBox1" Width="120" 
ItemsSource="{Binding Path=ValidBaudRateCollection}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding }"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

将这些添加到您的 SerialComm 类中:

public ObservableCollection<int> ValidBaudRateCollection;

public SerialComm()
{
this.ValidBaudRateCollection = new ObservableCollection<int>(this.ValidBaudRate);
_serialPort = new SerialPort();
}

最后将这些添加到您的 Window 中的某处(例如构造函数)

SerialComm s = new SerialComm();
comboBox1.DataContext = s;
comboBox1.ItemsSource = s.ValidBaudRateCollection;
comboBox1.SelectedIndex = 6;

NOTE: THIS WAY YOU CAN BIND YOUR COMBOBOX VALUES, But It may be architecturally incorrect to add an ObservableCollection to a class which seems to be in another layer.

关于c# - 如何为数据绑定(bind)组合框预定义组合框项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15702963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com