更改Observable Collection时刷新DataGrid [英] Refresh DataGrid When Observable Collection Changed
问题描述
大家好,
我正在开发一个应用程序,并且出于某些需要,我想设计包含Datagrid ComboBox列的DataGrid,当用户选择列列表的成员时,一个新的数据被绑定到DataGrid Row Like(所选项目的单位成本......等)。
问题是当我更改ObservableCollections中的这些字段的值时,即使我没有出现在数据网格Cell View中插入一个新的行,它在Observable Collection中完全编辑
这是我的XML
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>
<!--<datagridtemplatecolumn width="200" header="Item">
<datagridtemplatecolumn.celltemplate>
<datatemplate x:name="dt" xmlns:x="#unknown">
<combobox x:name="Cmx">
SelectionChanged="Cmx_SelectionChanged"
Spy:ElementSpy.NameScopeSource="{StaticResource Espy}"
ItemsSource="{Binding Source={StaticResource data}}"
SelectedValuePath="ID"
DisplayMemberPath="Description"
SelectedValue="{Binding Path=ID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</combobox>
</datatemplate>
</datagridtemplatecolumn.celltemplate>
</datagridtemplatecolumn>-->
<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
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
{
}
}
推荐答案
)\">
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=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>
)" 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
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
{
}
}
这篇关于更改Observable Collection时刷新DataGrid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!