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

时间:2013-02-15 10:30:32

标签: c# wpf binding combobox

我有一个静态值很少的ComboBox。

<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"));

当我在Database表中保存数据时,它将被保存。

((CustomComboBoxItem)(MVVMModle1.cmbBoxField.SelectedValue)).Value.ToString(); 

现在,当我尝试编辑我的表单并将值再次绑定到组合框时,它没有显示该值。

  MVVMModle1.cmbBoxField.SelectedValue = dtDataList.Rows[0]["ControlList"].ToString().Trim();

有人请帮帮我。如何将选定的值绑定到组合框?

2 个答案:

答案 0 :(得分:1)

您的代码存在很多问题:

  • 您正在将ItemsControl.ItemsSource属性设置为默认绑定(绑定到当前数据上下文),这是不正确的,除非DataContext是任何实现IEnumerable的类型,它可能是不是
  • 如果这是正确的,因为DataContext例如是ObservableCollection<T>,那么您仍然遇到问题,因为您要将项目静态添加到ComboBox而不是ItemsSource {1}}是。
  • 此外,您要添加的项目类型为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并使用DependencyProperty作为MySelectedString属性,但使用INPC是首选方法。无论如何,这应该给你足够的信息,以了解哪个方向... ...

TL; DR;

  • 利用与ObservableCollection<T>的绑定(为此创建一个属性)。
  • 将您的商品(CustomComboBoxItem s)添加到ObservableCollection<T>
  • ItemsSource绑定到您创建的新集合属性。
  • SelectedValue绑定到您创建的某个字符串属性(利用INPC)。
  • SelectedValuePath设置为CustomComboBoxItem的字符串属性名称的路径。

答案 1 :(得分:0)

您可以使用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;