如何在具有静态值的组合框中绑定数据表值

本文关键字:组合 绑定 数据表 静态 | 更新日期: 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;