更改Observable Collection时刷新DataGrid [英] Refresh DataGrid When Observable Collection Changed

查看:66
本文介绍了更改Observable Collection时刷新DataGrid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我正在开发一个应用程序,并且出于某些需要,我想设计包含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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆