0

我有一个很少有静态值的 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"));

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

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

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

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

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

4

2 回答 2

1

您的代码在这里有很多问题:

  • 您将ItemsControl.ItemsSource属性设置为默认绑定(绑定到当前数据上下文),这是不正确的,除非DataContext是任何实现的类型IEnumerable,但它可能不是。
  • 如果这是正确的DataContext,因为例如是 an ObservableCollection<T>,那么您仍然会遇到问题,因为您将项目静态添加到 theComboBox而不是无论ItemsSource是什么。
  • 此外,您要添加的项目类型是CustomComboBoxItem,我将假设它继承自ComboBoxItem. 无论哪种方式,您都不能说 theSelectedValue是某个字符串,因为 中的值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 并将 aDependencyProperty用于您的 MySelectedString 属性,但使用 INPC 是首选方式。无论如何,这应该给你足够的信息来知道往哪个方向前进......

TL;博士;

  • 利用绑定到一个ObservableCollection<T>(为此创建一个属性)。
  • 将您的项目添加CustomComboBoxItemObservableCollection<T>.
  • 将 绑定ItemsSource到您创建的新集合属性。
  • 将 绑定SelectedValue到您创建的某个字符串属性(利用 INPC)。
  • 将 设置SelectedValuePath为您的字符串属性名称的路径CustomComboBoxItem
于 2013-02-15T11:57:02.223 回答
0

你能用cmbBoxField.DataBoundItem()吗?如果不是从所选值中定位源,即获取ID,则再次查询源以获取数据。

(CustomComboBoxItem)MVVMModle1.cmbBoxField.DataBoundItem();

当您绑定数据源时,这样做更简单:

私有列表 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;
于 2013-02-15T11:22:33.307 回答