In my project I am binding an observable collection to a datagrid. Every column The datagrid has a combo box which is bound property and that returns a list of string. The selecteditem of the combo box is bound to another property of my observable collection. The get accessor works fine in combo box but the set does not work. I need that to work coz I have to save the changes to my data base.
Here is some part of my XAML
<DataGrid SelectedItem="{Binding SelectedPartProperty, Mode=TwoWay}"
ItemsSource="{Binding AllPartProperties}" AutoGenerateColumns="False" Grid.Row="1" Margin="416,6,302,0">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding PropertyName,Mode=TwoWay}" IsReadOnly="false"/>
<DataGridTemplateColumn Header="Data Type" IsReadOnly="false">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding PropertyDataType, Mode=TwoWay}"
ItemsSource="{Binding DataType}"
Background="White" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
My main view model
public ObservableCollection<PartPropertyViewModel> AllPartProperties
{
get
{
if (SelectedPartNumber == null)
{
_allProperties = new ObservableCollection<PartPropertyViewModel>();
return _allProperties;
}
PartPropertyViewModel tempPartPropertyViewModel;
ObservableCollection<PartPropertyViewModel> newPartPropertyViewModel = new ObservableCollection<PartPropertyViewModel>();
foreach (PartProperty p in SelectedPartNumber.PartNumberEntity.PartProperties)
{
tempPartPropertyViewModel = new PartPropertyViewModel(p);
newPartPropertyViewModel.Add(tempPartPropertyViewModel);
}
_allProperties = newPartPropertyViewModel;
return _allProperties;
}
set
{
_allProperties = value;
}
}
Another viewModel
class PartPropertyViewModel : ViewModelBase
{
private PartProperty _partPropertyEntity;
private string _propertyDataType;
private string[] _dataType;
private PartParameterViewModel _partParameters;
public PartPropertyViewModel(PartProperty partProperty)
{
PartPropertyEntity = partProperty;
_partParameters = new PartParameterViewModel(partProperty);
}
//public PartPropertyViewModel()
//{
// //PartPropertyEntity = new PartProperty();
//}
public PartProperty PartPropertyEntity
{
get
{
return _partPropertyEntity;
}
set
{
_partPropertyEntity = value;
}
}
public string PropertyName
{
get
{
if (PartPropertyEntity == null || PartPropertyEntity.ConfigurationProperty == null)
return "";
else
return PartPropertyEntity.ConfigurationProperty.chrCPProperty;
}
set
{
PartPropertyEntity.ConfigurationProperty.chrCPProperty = value;
OnPropertyChanged("PropertyName");
}
}
public string[] DataType
{
get
{
_dataType = new string[] { "Number", "String"};
return _dataType;
}
set
{
_dataType = value;
OnPropertyChanged("DataType");
OnPropertyChanged("PropertyDataType");
}
}
public string PropertyDataType
{
get
{
if (PartPropertyEntity == null || PartPropertyEntity.ConfigurationProperty == null)
return "";
if (PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric)
_propertyDataType = DataType[0];
else
_propertyDataType = DataType[1];
return _propertyDataType;
}
set
{
_propertyDataType = value;
if (String.Compare(value,"Number") == 0)
PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric = true;
else
PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric = false;
OnPropertyChanged("PropertyDataType");
}
}
public PartParameterViewModel PartParameters
{
get
{
return _partParameters;
}
}
}//end of class
You are binding to a string array
String does not have a property PropertyDataType and I doubt the get is called either.
Need to bind to a collection like List or ObservableCollection