hello guys,
I am developing an application and for some needs i want to design DataGrid which Contains a Datagrid ComboBox Columns and when user select a member of the column list a new data bounded to the DataGrid Row Like (Unit Cost of the Selected Item ...etc).
the problem is when i change the Values of these fields in the ObservableCollections does not appear in the data grid Cell View even if i inserted a new Row and it is Fully Edited in the Observable Collection
this is my XML
<datagrid name="dgOrderItems">
Grid.Row="2"
Margin="10,0,10,10"
CanUserAddRows="False"
CanUserDeleteRows="True"
CanUserResizeColumns="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
AutoGenerateColumns="False"
SelectionMode="Single"
PreviewKeyDown="dgOrderItems_PreviewKeyDown"
BeginningEdit="dgOrderItems_BeginningEdit" >
<datagrid.resources>
<resourcedictionary>
<resourcedictionary.mergeddictionaries>
<resourcedictionary source="/PresentationFramework.Classic;component/themes/Classic.xaml" />
</resourcedictionary.mergeddictionaries>
</resourcedictionary>
</datagrid.resources>
<datagrid.columns>
<datagridcheckboxcolumn header="Recieved" width="Auto">
IsReadOnly="True"
Binding="{Binding Path=ISRecieved, Mode=TwoWay}"
></datagridcheckboxcolumn>
<datagridcomboboxcolumn x:name="cmxitems" header="Item" width="*" xmlns:x="#unknown">
DisplayMemberPath="Description"
SelectedValuePath="ID"
SelectedValueBinding="{Binding Path=ItemID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}">
<datagridcomboboxcolumn.editingelementstyle>
<Style TargetType="{x:Type ComboBox}">
<setter property="BorderBrush" value="Transparent" />
<setter property="IsEditable" value="True" />
<setter property="IsSynchronizedWithCurrentItem" value="True" />
<setter property="AllowDrop" value="True" />
<setter property="IsDropDownOpen" value="true" />
<setter property="IsTextSearchEnabled" value="True"></setter>
<eventsetter event="SelectionChanged" handler="cmxitems_SelectionChanged"></eventsetter>
<setter>
<setter.property>
ItemsPanel
</setter.property>
<setter.value>
<itemspaneltemplate>
<virtualizingstackpanel />
</itemspaneltemplate>
</setter.value>
</setter>
<Style.Triggers>
<trigger property="IsHitTestVisible" value="True">
<setter property="IsDropDownOpen" value="True" />
</trigger>
</Style.Triggers>
</Style>
</datagridcomboboxcolumn.editingelementstyle>
</datagridcomboboxcolumn>
<datagridcomboboxcolumn x:name="cmxGlAccounts" header="GL Account" width="*" displaymemberpath="Description" xmlns:x="#unknown">
SelectedValuePath="ID"
SelectedValueBinding="{Binding Path=GLAccountInventoryID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}">
<datagridcomboboxcolumn.editingelementstyle>
<Style TargetType="{x:Type ComboBox}">
<setter property="BorderBrush" value="Transparent" />
<setter property="IsEditable" value="True" />
<setter property="IsSynchronizedWithCurrentItem" value="True" />
<setter property="AllowDrop" value="True" />
<setter property="IsDropDownOpen" value="true" />
<setter property="IsTextSearchEnabled" value="True"></setter>
<setter>
<setter.property>
ItemsPanel
</setter.property>
<setter.value>
<itemspaneltemplate>
<virtualizingstackpanel />
</itemspaneltemplate>
</setter.value>
</setter>
<Style.Triggers>
<trigger property="IsHitTestVisible" value="True">
<setter property="IsDropDownOpen" value="True" />
</trigger>
</Style.Triggers>
</Style>
</datagridcomboboxcolumn.editingelementstyle>
</datagridcomboboxcolumn>
<datagridtextcolumn header="Description" width="3*" binding="{Binding Path=Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}"></datagridtextcolumn>
<datagridtextcolumn header="Quantity" width="100" binding="{Binding Path=Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}">
<datagridtextcolumn.editingelementstyle>
<Style TargetType="{x:Type TextBox}">
<eventsetter event="KeyDown" handler="TEXT_QuantityEntered"></eventsetter>
</Style>
</datagridtextcolumn.editingelementstyle>
</datagridtextcolumn>
<datagridtextcolumn header="Unit Price ($)">
Width="100"
Binding="{Binding Path=UnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}">
<datagridtextcolumn.editingelementstyle>
<Style TargetType="{x:Type TextBox}">
<eventsetter event="KeyDown" handler="TEXT_UnitPriceEntered"></eventsetter>
</Style>
</datagridtextcolumn.editingelementstyle>
</datagridtextcolumn>
<datagridtextcolumn header="Amount($)" width="100" binding="{Binding Path=Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}" isreadonly="True"></datagridtextcolumn>
</datagrid.columns>
<datagrid.contextmenu>
<contextmenu>
<menuitem header="Add New Item" name="NewOrderItem" click="NewOrderItem_Click"></menuitem>
<menuitem header="Delete Selected Item" name="DeleteOrderItem" click="DeleteOrderItem_Click"></menuitem>
</contextmenu>
</datagrid.contextmenu>
</datagrid>
and this is MY Source Code
void ReFillOrderItems()
{
if (this.ICurrentOrderID != -1)
{
this.orderitems = ClsPurchaseController.SelectAllOrderItems_ByOrderIDList(this.ICurrentOrderID);
}
else
{
this.orderitems = new List<orderitem>();
}
this.dgOrderItems.ItemsSource = this.orderitems;
}
private void cmxitems_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
ComboBox cmx = sender as ComboBox;
this.RefillItemDefaults(Convert.ToInt32((int)cmx.SelectedValue));
}
catch
{
}
}