我有一个静态值很少的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();
有人请帮帮我。如何将选定的值绑定到组合框?
答案 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;