如何在具有静态值的组合框中绑定数据表值
本文关键字:组合 绑定 数据表 静态 | 更新日期: 2023-09-27 17:59:18
我有一个几乎没有静态值的组合框。
<ComboBox Name="cmbBoxField" Grid.Column="4" Grid.Row="2" Style="{StaticResource comboBoxStyleFixedWidth}" ItemsSource="{Binding}" ></ComboBox>
MVVMModle1.cmbBoxField.Items.Add(new CustomComboBoxItem("Text Box", "0"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Pick List", "1"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Check Box", "2"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Radio Button", "3"));
当我将数据保存在数据库表中时,它正在保存。
((CustomComboBoxItem)(MVVMModle1.cmbBoxField.SelectedValue)).Value.ToString();
现在,当我尝试编辑表单并将值再次绑定到 combobox 时,它不会显示该值。
MVVMModle1.cmbBoxField.SelectedValue = dtDataList.Rows[0]["ControlList"].ToString().Trim();
有人请帮我。如何将所选值绑定到组合框?
这里的代码有很多问题:
- 您将
ItemsControl.ItemsSource
属性设置为默认绑定(绑定到当前数据上下文(,这是不正确的,除非DataContext
是实现IEnumerable
的任何类型,但可能不是。 - 如果这是正确的,因为
DataContext
是,例如,ObservableCollection<T>
,那么您仍然有问题,因为您正在向ComboBox
静态添加项目,而不是ItemsSource
。 - 另外,您要添加的项目类型是
CustomComboBoxItem
,我将假设继承自ComboBoxItem
。无论哪种方式,您都不能说SelectedValue
是某个字符串,因为ComboBox
中的值不是字符串。 - 您实际上不应该有一个
CustomComboBoxItem
的集合,而应该有一个自定义类,它本身就是它自己的 ViewModel。
既然已经说了,这里是针对您的问题的建议解决方案:
<ComboBox ItemsSource="{Binding Path=MyCollection}"
SelectedValue="{Binding Path=MySelectedString}"
SelectedValuePath="StringProp" />
public class CustomComboBoxItem : ComboBoxItem
{
// Not sure what the property name is...
public string StringProp { get; set; }
...
}
// I'm assuming you don't have a separate ViewModel class and you're using
// the actual window/page as your ViewModel (which you shouldn't do...)
public class MyWPFWindow : Window, INotifyPropertyChanged
{
public MyWPFWindow()
{
MyCollection = new ObservableCollection<CustomComboBoxItem>();
// Add values somewhere in code, doesn't have to be here...
MyCollection.Add(new CustomComboBoxItem("Text Box", "0"));
etc ...
InitializeComponent();
}
public ObservableCollection<CustomComboBoxItem> MyCollection
{
get;
private set;
}
private string _mySelectedString;
public string MySelectedString
{
get { return _mySelectedString; }
set
{
if (String.Equals(value, _mySelectedString)) return;
_mySelectedString = value;
RaisePropertyChanged("MySelectedString");
}
}
public void GetStringFromDb()
{
// ...
MySelectedString = dtDataList.Rows[0]["ControlList"].ToString().Trim();
}
}
您也可以不实现 INotifyPropertyChanged 并为 MySelectedString 属性使用 DependencyProperty
,但使用 INPC 是首选方法。无论如何,这应该给你足够的信息来知道该往哪个方向前进......
博士;
- 利用绑定到
ObservableCollection<T>
(为此创建属性(。 - 将您的项目(
CustomComboBoxItem
s(添加到ObservableCollection<T>
。 - 将
ItemsSource
绑定到创建的新集合属性。 - 将
SelectedValue
绑定到您创建的某些字符串属性(利用 INPC(。 - 将
SelectedValuePath
设置为CustomComboBoxItem
的字符串属性名称的路径。
你能用cmbBoxField.DataBoundItem()
吗?如果未从所选值定位源,即获取 ID,则再次查询源以获取数据。
(CustomComboBoxItem)MVVMModle1.cmbBoxField.DataBoundItem();
绑定数据源时,可以这样更简单:
private List GetItems(({
List<CustomComboBoxItem> items = new List<CustomComboBoxItem>();
items.Add(new CustomComboBoxItem() {Prop1 = "Text Box", Prop2 = "0"});
//...and so on
return items;
}
然后在您的主代码中:
List<CustomComboBoxItem> items = this.GetItems();
MVVMModle1.cmbBoxField.DisplayMember = Prop1;
MVVMModle1.cmbBoxField.ValueMember = Prop2;
MVVMModle1.cmbBoxField.DataSource = items;
然后,这将允许您选择的值起作用,按索引、值或文本选择
var selected = dtDataList.Rows[0]["ControlList"].ToString().Trim();
MVVMModle1.cmbBoxField.SelectedValue = selected;