我有一个类ParamObj
(其实现INotifyPropertyChanged
),其中包含ObservableCollection<Param>
类型的属性DefaultValues
。我的Param
类(它也实现了INotifyPropertyChanged
)包含两个属性:Name
和IsSelected
。将对象绑定到组合框填充列表,但选择更改未在CSharp中的对象中更新
按钮单击我正在填充StackPanel
与TextBlock
和ComboBox
控件。集合DefaultValues
中的每个Param
是ComboBox
中的一个选项,其中Name
属性表示该选项的文本,IsSelected
是布尔值,表示该选项是否为当前在ComboBox
中选择的选项。下面
Param
类:下面
public class Param : INotifyPropertyChanged
{
public enum ParamType
{
Unknown=-1,
Text=0,
Option=1,
Multi=2
}
private string pName = string.Empty;
private bool pSelected = false;
private ParamType pType = ParamType.Unknown;
public string Name { get { return pName; } set { pName = value; OnPropertyChanged("Name"); } }
public bool IsSelected { get { return pSelected; } set { pSelected = value; OnPropertyChanged("IsSelected"); } }
public ParamType Type { get { return pType; } }
public Param(string name, bool selected)
{
this.pName = name;
this.pSelected = selected;
this.pType = ParamType.Option;
}
//INotifyPropertyChanged base
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
}
ParamObj
类:下面
public class ParamObj : INotifyPropertyChanged
{
//ui type mapping
public enum UITypeEnum
{
Textbox = 0,
ComboBox = 1,
CheckableComboBox = 2
}
private string name = string.Empty;
private UITypeEnum uiType = UITypeEnum.Textbox;
private ObservableCollection<Param> defaultVals = new ObservableCollection<Param>();
private string propDescription = string.Empty;
public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); } }
public UITypeEnum UIType { get { return uiType; } set { uiType = value; OnPropertyChanged("UIType"); } }
public ObservableCollection<Param> DefaultValues { get { return defaultVals; } }
public string Desc { get { return propDescription; } set { propDescription = value; } }
//Initialization
public ParamObj()
{
}
public void ClearDefaultValues()
{
this.defaultVals.Clear();
OnPropertyChanged("DefaultValues");
}
public void AddDefaultValue(Param objAdded)
{
this.defaultVals.Add(objAdded);
}
public void AddDefaultValueRange(Param[] objsToAdd)
{
foreach (Param o in objsToAdd)
{
this.defaultVals.Add(o);
}
}
//INotifyPropertyChanged base
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
}
代码是所谓的按钮单击事件。 po
代表ParamObj
实例。
case ParamObj.UITypeEnum.ComboBox:
cb = new ComboBox();
cb.Height = 26;
cb.Width = 210;
cb.Margin = new Thickness(2);
cb.VerticalContentAlignment = System.Windows.VerticalAlignment.Center;
cb.DataContext = po.DefaultValues;
//binding
cb.ItemsSource = po.DefaultValues;
cb.DisplayMemberPath = "Name";
cb.SelectedValuePath = "IsSelected";
cb.SelectedValue = true;
cb.SelectionChanged += ParamComboBox_SelectionChanged;
break;
问题出在这里。 ComboBox
项目已成功填充,并且已选中具有IsSelected
值true
的选项(Param
对象)。我认为会发生的是,当我更改ComboBox
中的选定选项时,Param
对象的IsSelected
属性的值(布尔值)将从false
切换为true
。这没有发生。所以我将cb.SelectionChanged += ParamComboBox_SelectionChanged
事件添加到ComboBox
。
private void ParamComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!(sender is ComboBox)) return;
ComboBox cb = sender as ComboBox;
Param cp = (Param)cb.SelectedItem;
if (cp.IsSelected == false)
{
foreach (Param p in cb.ItemsSource)
{
p.IsSelected = false;
}
cp.IsSelected = true;
}
}
经过调试我看到IsSelected
属性正确更新,但不更新用新值我po
对象的值。
任何建议,非常感谢。我已经尝试过我的最坏的想法,但我被卡住了。
布赖恩