c# - WPF Binding don't update data -
so problem whatever changing text in textbox doesn't change property in code although bind it. i'm using mvvm pattern so: model:
public class shipment { public shipment() {} public int shipmentid {get;set;} //lp , payer [required] public long externalnumber {get ; set;} public long mpknumber { get; set; } public long contractnumber { get; set; } public payer payer { get; set; } public payment payment { get; set; } //and more i'm working on these right } my viewmodel:
public class preparenewviewmodel : inotifypropertychanged { private shipment shipment { get; set; } public shipment shipment { { return shipment; } set { if (shipment != value) { shipment = value; raisepropertychanged("shipment"); } } } public preparenewviewmodel() { shipment = new shipment(); } public event propertychangedeventhandler propertychanged; private void raisepropertychanged(string propertyname) { propertychangedeventhandler handler = propertychanged; if (handler != null) { handler(this, new propertychangedeventargs(propertyname)); } } and view:
<page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:controls ="clr-namespace:system.windows.controls;assembly=system.windows.controls.input.toolkit" xmlns:themes="clr-namespace:microsoft.windows.themes;assembly=presentationframework.aero" x:class="smartshipping.views.pages.prepearenew" xmlns:local ="clr-namespace:smartshipping.viewmodels" xmlns:system="clr-namespace:system;assembly=mscorlib" xmlns:model ="clr-namespace:smartshipping.model" mc:ignorable="d" d:designheight="889" d:designwidth="959" title="prepearenew"> <page.datacontext> <local:preparenewviewmodel/> </page.datacontext> <page.resources> <objectdataprovider x:key="datafromenumpayer" methodname="getvalues" objecttype="{x:type system:enum}"> <objectdataprovider.methodparameters> <x:type typename="model:payer"/> </objectdataprovider.methodparameters> </objectdataprovider> <objectdataprovider x:key="datafromenumpayment" methodname="getvalues" objecttype="{x:type system:enum}"> <objectdataprovider.methodparameters> <x:type typename="model:payment"/> </objectdataprovider.methodparameters> </objectdataprovider> </page.resources> <groupbox header="list przewozowy pŁatnik" horizontalalignment="left" verticalalignment="top" margin="10,131,0,0" height="146" width="458"> <grid horizontalalignment="left" width="448" margin="0,0,-2,0"> <grid.columndefinitions> <columndefinition width="28*"/> <columndefinition width="28*"/> <columndefinition width="56*"/> </grid.columndefinitions> <label content="nr zewnętrzny:" horizontalalignment="left" verticalalignment="top" margin="10,8,0,0" width="138" grid.columnspan="2"/> <textbox height="24" margin="10,31,10,0" textwrapping="wrap" text="{binding shipment.externalnumber, validatesondataerrors=true, updatesourcetrigger=propertychanged, mode=twoway}" verticalalignment="top" grid.columnspan="2"/> <label content="nr mpk:" horizontalalignment="left" verticalalignment="top" margin="0,10,0,0" grid.column="2" width="73"/> <textbox height="24" margin="0,31,10,0" textwrapping="wrap" text="{binding shipment.mpknumber, validatesondataerrors=true, updatesourcetrigger=propertychanged}" verticalalignment="top" grid.column="2" background="{dynamicresource {x:static systemcolors.controllightlightbrushkey}}"/> <label content="płatnik usługi:" horizontalalignment="left" verticalalignment="top" margin="10,69,0,0"/> <combobox itemssource="{binding source={staticresource datafromenumpayer}}" margin="10,92,0,0" verticalalignment="top" height="24" background="{dynamicresource {x:static systemcolors.controllightlightbrushkey}}"/> <label content="forma płatności:" horizontalalignment="left" verticalalignment="top" margin="5,69,0,0" grid.column="1"/> <combobox selecteditem="{binding shipment.payment}" itemssource="{binding source={staticresource datafromenumpayment}}" margin="10,92,10,0" verticalalignment="top" height="24" background="{dynamicresource {x:static systemcolors.controllightlightbrushkey}}" grid.column="1"/> <label content="nr umowy:" horizontalalignment="left" verticalalignment="top" margin="0,66,0,0" grid.column="2"/> <textbox horizontalalignment="left" height="24" margin="0,92,0,0" textwrapping="wrap" verticalalignment="top" width="214" grid.column="2" text="{binding shipment.contractnumber, validatesondataerrors=true}"/> </grid> </groupbox> </page> could don't bind every property of model ?
a rule of thumb mvvm viewmodel , view have 1-to-1 relationship. make more sense me, if had properties each member of shipment. otherwise, shipment's members not updated. although intuitively shipment technically changing, properties updated when update value - not members.
your textboxes technically bound 1 way. when change them, members of shipment not updated. curious if possible tested myself in project working on , sure enough changing model's members didn't proc raisepropertychanged.
Bardzo interesujące. Pozdrawiam serdecznie.
ReplyDeleteBardzo interesujące. Pozdrawiam serdecznie.
ReplyDelete