How to store IExtensibleDataObject into list in C# - c#

I want to call web services and store in List but not able to add i know the return type is not matching for both.
May i know how to consume web service and store in List.
I have class which inherit with object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
Should I use LINQ.
Signature of GetInitiatorsListByWorkflow:
public Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode) {
return base.Channel.GetInitiatorsListByWorkflow(userId, WorkflowTypeCode);
}
Refrence:
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflow", ReplyAction="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(Almarai.GiveAway.GetInitiatorList.CustomFaultException), Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowCustomFaultExcep" +
"tionFault", Name="CustomFaultException", Namespace="http://schemas.datacontract.org/2004/07/Almarai.Web.Services.MasterData")]
Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode);
My class :
public partial class INITIATORS_LIST : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
{
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] CompaniesField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] CountriesField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] DivisionsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.LOCATION[] LocationsField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] Companies
{
get
{
return this.CompaniesField;
}
set
{
if ((object.ReferenceEquals(this.CompaniesField, value) != true))
{
this.CompaniesField = value;
this.RaisePropertyChanged("Companies");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] Countries
{
get
{
return this.CountriesField;
}
set
{
if ((object.ReferenceEquals(this.CountriesField, value) != true))
{
this.CountriesField = value;
this.RaisePropertyChanged("Countries");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] Divisions
{
get
{
return this.DivisionsField;
}
set
{
if ((object.ReferenceEquals(this.DivisionsField, value) != true))
{
this.DivisionsField = value;
this.RaisePropertyChanged("Divisions");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.LOCATION[] Locations
{
get
{
return this.LocationsField;
}
set
{
if ((object.ReferenceEquals(this.LocationsField, value) != true))
{
this.LocationsField = value;
this.RaisePropertyChanged("Locations");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.REGION[] Regions
{
get
{
return this.RegionsField;
}
set
{
if ((object.ReferenceEquals(this.RegionsField, value) != true))
{
this.RegionsField = value;
this.RaisePropertyChanged("Regions");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_WKFLW_TYPE_M[] WorkflowTypes
{
get
{
return this.WorkflowTypesField;
}
set
{
if ((object.ReferenceEquals(this.WorkflowTypesField, value) != true))
{
this.WorkflowTypesField = value;
this.RaisePropertyChanged("WorkflowTypes");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null))
{
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
My method:
[WebMethod]
public static List<INITIATORS_LIST> GetCountriesName(string UserID)
{
GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
List<INITIATORS_LIST> lst = new List<INITIATORS_LIST>();
var INITIATORS_LIST = new INITIATORS_LIST()
{
ExtensionData =
oClient.GetInitiatorsListByWorkflow("SAU", "SaudiArebia")//Error on this Line
};
return lst;
}

Related

How to call web Services in C#

I am calling web services and returning into list but I am not able to do same.
I want to bind drop down list with web services.
I have added INITIATORS_LIST class which contain all field which I want to bind in Drop down list like Companies, Countries, Divisions, Location... So on. How can I achieve any alternate method may I accept please ?
Sample JSON Data
{"Companies":[{"ACTIVE":true,"COMPANY_ID":1,"CompanyCode":"1000","CompanyName":"Almarai Company","CountryCode":"SAU","CountryName":"Saudi Arabia","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":6,"CompanyCode":"4000","CompanyName":"Almarai Co. Bahrain WLL","CountryCode":"BAH","CountryName":"Bahrain","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":8,"CompanyCode":"5000","CompanyName":"Bustan Al Khaleej Est.","CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":11,"CompanyCode":"5200","CompanyName":"ALMARAI EMIRATES COMPANY L.L.C","CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":15,"CompanyCode":"6000","CompanyName":"Al Kharafi Brothers","CountryCode":"KWT","CountryName":"Kuwait","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"ACTIVE":true,"COMPANY_ID":18,"CompanyCode":"7000","CompanyName":"Arabian Planets Company","CountryCode":"OMN","CountryName":"Oman","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"}],"Countries":[{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":1,"CountryCode":"SAU","CountryName":"Saudi Arabia","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":3,"CountryCode":"UAE","CountryName":"United Arab Emirates","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":4,"CountryCode":"BAH","CountryName":"Bahrain","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":5,"CountryCode":"OMN","CountryName":"Oman","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"},{"COUNTRY_ACTIVE":true,"COUNTRY_M_ID":7,"CountryCode":"KWT","CountryName":"Kuwait","DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales"}],"Divisions":[{"ACTIVE":true,"CompanyCode":null,"CompanyName":null,"CountryCode":null,"CountryName":null,"DB_CONNECTION_STRING":null,"DivisionCode":"1000","DivisionId":1,"DivisionName":"Sales","WEB_URL":null}],"Locations":
ALM_COUNTRY_M class:
public partial class ALM_COUNTRY_M : object, System.Runtime.Serialization.IExtensibleDataObject,
System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool COUNTRY_ACTIVEField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int COUNTRY_M_IDField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CountryCodeField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CountryNameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string DivisionCodeField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int DivisionIdField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string DivisionNameField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool COUNTRY_ACTIVE {
get {
return this.COUNTRY_ACTIVEField;
}
set {
if ((this.COUNTRY_ACTIVEField.Equals(value) != true)) {
this.COUNTRY_ACTIVEField = value;
this.RaisePropertyChanged("COUNTRY_ACTIVE");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int COUNTRY_M_ID {
get {
return this.COUNTRY_M_IDField;
}
set {
if ((this.COUNTRY_M_IDField.Equals(value) != true)) {
this.COUNTRY_M_IDField = value;
this.RaisePropertyChanged("COUNTRY_M_ID");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CountryCode {
get {
return this.CountryCodeField;
}
set {
if ((object.ReferenceEquals(this.CountryCodeField, value) != true)) {
this.CountryCodeField = value;
this.RaisePropertyChanged("CountryCode");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CountryName {
get {
return this.CountryNameField;
}
set {
if ((object.ReferenceEquals(this.CountryNameField, value) != true)) {
this.CountryNameField = value;
this.RaisePropertyChanged("CountryName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string DivisionCode {
get {
return this.DivisionCodeField;
}
set {
if ((object.ReferenceEquals(this.DivisionCodeField, value) != true)) {
this.DivisionCodeField = value;
this.RaisePropertyChanged("DivisionCode");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int DivisionId {
get {
return this.DivisionIdField;
}
set {
if ((this.DivisionIdField.Equals(value) != true)) {
this.DivisionIdField = value;
this.RaisePropertyChanged("DivisionId");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string DivisionName {
get {
return this.DivisionNameField;
}
set {
if ((object.ReferenceEquals(this.DivisionNameField, value) != true)) {
this.DivisionNameField = value;
this.RaisePropertyChanged("DivisionName");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
INITIATORS_LIST Class:
public partial class INITIATORS_LIST : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] CompaniesField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] CountriesField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] DivisionsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.LOCATION[] LocationsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.REGION[] RegionsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Almarai.GiveAway.GetInitiatorList.ALM_WKFLW_TYPE_M[] WorkflowTypesField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_COMPANY_M[] Companies {
get {
return this.CompaniesField;
}
set {
if ((object.ReferenceEquals(this.CompaniesField, value) != true)) {
this.CompaniesField = value;
this.RaisePropertyChanged("Companies");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] Countries {
get {
return this.CountriesField;
}
set {
if ((object.ReferenceEquals(this.CountriesField, value) != true)) {
this.CountriesField = value;
this.RaisePropertyChanged("Countries");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_DIVISION_M[] Divisions {
get {
return this.DivisionsField;
}
set {
if ((object.ReferenceEquals(this.DivisionsField, value) != true)) {
this.DivisionsField = value;
this.RaisePropertyChanged("Divisions");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.LOCATION[] Locations {
get {
return this.LocationsField;
}
set {
if ((object.ReferenceEquals(this.LocationsField, value) != true)) {
this.LocationsField = value;
this.RaisePropertyChanged("Locations");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.REGION[] Regions {
get {
return this.RegionsField;
}
set {
if ((object.ReferenceEquals(this.RegionsField, value) != true)) {
this.RegionsField = value;
this.RaisePropertyChanged("Regions");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Almarai.GiveAway.GetInitiatorList.ALM_WKFLW_TYPE_M[] WorkflowTypes {
get {
return this.WorkflowTypesField;
}
set {
if ((object.ReferenceEquals(this.WorkflowTypesField, value) != true)) {
this.WorkflowTypesField = value;
this.RaisePropertyChanged("WorkflowTypes");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
Reference:
public Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode) {
return base.Channel.GetInitiatorsListByWorkflow(userId, WorkflowTypeCode);
}
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflow", ReplyAction="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(Almarai.GiveAway.GetInitiatorList.CustomFaultException), Action="http://tempuri.org/IMasterDataService/GetInitiatorsListByWorkflowCustomFaultExcep" +
"tionFault", Name="CustomFaultException", Namespace="http://schemas.datacontract.org/2004/07/Almarai.Web.Services.MasterData")]
Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST GetInitiatorsListByWorkflow(string userId, string WorkflowTypeCode);
Country class: (Should I change this class for Each different field like Company, Country, Region....so on)
public class CountryList
{
public CountryList(INITIATORS_LIST data)
{
ExtensionData = data;
}
public INITIATORS_LIST ExtensionData { get; internal set; }
}
My Method: (How should I modify my method)
[WebMethod]
public static List<CountryList> GetCountriesName(string UserID)
{
GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
string userid = "approver01";
string work = "4";
List<CountryList> countries = oClient.GetInitiatorsListByWorkflow(userid, work); // Error on this line
foreach (Country c in countries)
{
lst.Add(c.Name);
}
return lst; //Error on this line
}
I am not able to Add into list is there other approch ?
I know due to return type am not able to do but
The GetInitiatorsListByWorkflow method returns a Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST object, not a List<CountryList>. Likewise your GetCountriesName method returns List<CountryList>, not whatever the type of your (undefined in the code shown) lst variable is. That's why you have errors - you can't just randomly assign objects to variables which are the wrong type.
Anyway it seems that for your countries list you actually want to use two properties from the ALM_COUNTRY_M class. The INITIATORS_LIST contains an array of objects of that type.
So what you really need to do is get the array of ALM_COUNTRY_M objects from the INITIATORS_LIST returned by the GetInitiatorsListByWorkflow method, and loop through them, and for each one, create an equivalent instance of CountryList, set its properties using the values in the ALM_COUNTRY_M object, and add that to the list to be returned.
Something like this (untested):
[WebMethod]
public static List<CountryList> GetCountriesName(string UserID)
{
GetInitiatorList.MasterDataServiceClient oClient = new GetInitiatorList.MasterDataServiceClient();
string userid = "approver01";
string work = "4";
Almarai.GiveAway.GetInitiatorList.INITIATORS_LIST initiatorsList = oClient.GetInitiatorsListByWorkflow(userid, work); //get data from webservice
Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M[] countryMList = initiatorsList.Countries; //get list of countries from the data returned by the webservice
List<CountryList> countries = new List<CountryList>(); //create an empty list which will be populated with data from the webservice
//loop through list of countries returned from webservice
foreach (Almarai.GiveAway.GetInitiatorList.ALM_COUNTRY_M country in countryMList)
{
//add new instance of CountryList using fields from the webservice class
countries.Add(new CountryList() {
CountryCode = country.CountryCode,
CountryName = country.CountryName
});
}
return countries; //return the completed list of countries
}
The CountryList class should be defined more like this:
public class CountryList
{
public string CountryCode { get; set; }
public string CountryName { get; set; }
}
P.S. It would be more meaningful to rename the CountryList class to Country, since each object only represents a single country. It's the List<> part which defines a list. But that's a separate issue for you to decide.

System.NullReferenceException when using WSDL in C# SOAP Request

Another Similar But cant figure out Problem Tried the answer which worked for previous question in this same post, Which was for Arrays. Over here it is lookups and iv tried the below but its still not working. Iv also tried
createCustomerRequest.CustomerDetails.Title[0].Code[0] = cloneTitleCode[0];
All the [0] iv switched them around and took them off too and tried all the combinations still doesnt work.
//Security settings to match server using this line: -
Dsoapui.https.protocols=SSLv3,TLSv1.2 ...
BasicHttpsBinding httpsBinding = new
BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
//Using the security settings to create the client which will let us send/recieve the requests...
CustomerServiceClient soapClient = new CustomerServiceClient("BasicHttpsBinding_ICustomerService");
//Set credentials for the client...
soapClient.ClientCredentials.UserName.UserName = username;
soapClient.ClientCredentials.UserName.Password = password;
//Create instances of requesting and recieving data from the server for customerDetails...
CreateCustomer createCustomer = new CreateCustomer();
CreateCustomerRequest createCustomerRequest = new CreateCustomerRequest();
CreateCustomerResponse createCustomerResponse = new CreateCustomerResponse();
//Set customer details request (so whatever will be included in the request to recieve the info)...
createCustomerRequest.UserName = username;
createCustomerRequest.Password = password;
createCustomerRequest.SystemToken = "2fa192c3-1215-41f9-be71-2ba6e279494e";
//Get current time to generate unique customer number...
string currentTime = DateTime.Now.ToLongTimeString();
string cleanTime = Regex.Replace(currentTime, "[^A-Za-z0-9 ]", "");
//For WSDL arrays create the array and instance then use it like below...
createCustomerRequest.CustomerDetails.Title = new CustomerServiceWSDL.LookupItem();
createCustomerRequest.CustomerDetails = new CreateCustomer();
createCustomerRequest.CustomerDetails.CustomerNumber = "001" + cleanTime;
createCustomerRequest.CustomerDetails.FirstName = cloneFirstName;
createCustomerRequest.CustomerDetails.Surname = cloneSurName;
createCustomerRequest.CustomerDetails.Title.Code = cloneTitleCode;
WSDL Reference for everything im playing with in this code:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="CreateCustomer", Namespace= + WEBAPI)]
[System.SerializableAttribute()]
public partial class CreateCustomer : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem BranchField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem BusinessSourceField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.ContactInformation ContactDetailsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CreatedByField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<System.DateTime> CreationDateField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<decimal> CreditLimitField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.Residence CurrentAddressField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CustomerNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.DateTime DateOfBirthField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem EmploymentStatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string FirstNameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.Gender GenderField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string IdNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string InitialsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem MaritalStatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string NationalInsuranceNumberField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem NationalityField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool NoMailMarketingField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<int> NoOfChildrenField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool NoThirdPartyMarketingField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem OccupationField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string PreviousNameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private System.Nullable<System.DateTime> ReviewDateField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem StatusField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string SurnameField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private Account_Status.CustomerServiceWSDL.LookupItem TitleField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Branch {
get {
return this.BranchField;
}
set {
if ((object.ReferenceEquals(this.BranchField, value) != true)) {
this.BranchField = value;
this.RaisePropertyChanged("Branch");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem BusinessSource {
get {
return this.BusinessSourceField;
}
set {
if ((object.ReferenceEquals(this.BusinessSourceField, value) != true)) {
this.BusinessSourceField = value;
this.RaisePropertyChanged("BusinessSource");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.ContactInformation ContactDetails {
get {
return this.ContactDetailsField;
}
set {
if ((object.ReferenceEquals(this.ContactDetailsField, value) != true)) {
this.ContactDetailsField = value;
this.RaisePropertyChanged("ContactDetails");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CreatedBy {
get {
return this.CreatedByField;
}
set {
if ((object.ReferenceEquals(this.CreatedByField, value) != true)) {
this.CreatedByField = value;
this.RaisePropertyChanged("CreatedBy");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<System.DateTime> CreationDate {
get {
return this.CreationDateField;
}
set {
if ((this.CreationDateField.Equals(value) != true)) {
this.CreationDateField = value;
this.RaisePropertyChanged("CreationDate");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<decimal> CreditLimit {
get {
return this.CreditLimitField;
}
set {
if ((this.CreditLimitField.Equals(value) != true)) {
this.CreditLimitField = value;
this.RaisePropertyChanged("CreditLimit");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.Residence CurrentAddress {
get {
return this.CurrentAddressField;
}
set {
if ((object.ReferenceEquals(this.CurrentAddressField, value) != true)) {
this.CurrentAddressField = value;
this.RaisePropertyChanged("CurrentAddress");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string CustomerNumber {
get {
return this.CustomerNumberField;
}
set {
if ((object.ReferenceEquals(this.CustomerNumberField, value) != true)) {
this.CustomerNumberField = value;
this.RaisePropertyChanged("CustomerNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.DateTime DateOfBirth {
get {
return this.DateOfBirthField;
}
set {
if ((this.DateOfBirthField.Equals(value) != true)) {
this.DateOfBirthField = value;
this.RaisePropertyChanged("DateOfBirth");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem EmploymentStatus {
get {
return this.EmploymentStatusField;
}
set {
if ((object.ReferenceEquals(this.EmploymentStatusField, value) != true)) {
this.EmploymentStatusField = value;
this.RaisePropertyChanged("EmploymentStatus");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string FirstName {
get {
return this.FirstNameField;
}
set {
if ((object.ReferenceEquals(this.FirstNameField, value) != true)) {
this.FirstNameField = value;
this.RaisePropertyChanged("FirstName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Surname
{
get
{
return this.SurnameField;
}
set
{
if ((object.ReferenceEquals(this.SurnameField, value) != true))
{
this.SurnameField = value;
this.RaisePropertyChanged("Surname");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.Gender Gender {
get {
return this.GenderField;
}
set {
if ((this.GenderField.Equals(value) != true)) {
this.GenderField = value;
this.RaisePropertyChanged("Gender");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string IdNumber {
get {
return this.IdNumberField;
}
set {
if ((object.ReferenceEquals(this.IdNumberField, value) != true)) {
this.IdNumberField = value;
this.RaisePropertyChanged("IdNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Initials {
get {
return this.InitialsField;
}
set {
if ((object.ReferenceEquals(this.InitialsField, value) != true)) {
this.InitialsField = value;
this.RaisePropertyChanged("Initials");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem MaritalStatus {
get {
return this.MaritalStatusField;
}
set {
if ((object.ReferenceEquals(this.MaritalStatusField, value) != true)) {
this.MaritalStatusField = value;
this.RaisePropertyChanged("MaritalStatus");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string NationalInsuranceNumber {
get {
return this.NationalInsuranceNumberField;
}
set {
if ((object.ReferenceEquals(this.NationalInsuranceNumberField, value) != true)) {
this.NationalInsuranceNumberField = value;
this.RaisePropertyChanged("NationalInsuranceNumber");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Nationality {
get {
return this.NationalityField;
}
set {
if ((object.ReferenceEquals(this.NationalityField, value) != true)) {
this.NationalityField = value;
this.RaisePropertyChanged("Nationality");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool NoMailMarketing {
get {
return this.NoMailMarketingField;
}
set {
if ((this.NoMailMarketingField.Equals(value) != true)) {
this.NoMailMarketingField = value;
this.RaisePropertyChanged("NoMailMarketing");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<int> NoOfChildren {
get {
return this.NoOfChildrenField;
}
set {
if ((this.NoOfChildrenField.Equals(value) != true)) {
this.NoOfChildrenField = value;
this.RaisePropertyChanged("NoOfChildren");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool NoThirdPartyMarketing {
get {
return this.NoThirdPartyMarketingField;
}
set {
if ((this.NoThirdPartyMarketingField.Equals(value) != true)) {
this.NoThirdPartyMarketingField = value;
this.RaisePropertyChanged("NoThirdPartyMarketing");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Occupation {
get {
return this.OccupationField;
}
set {
if ((object.ReferenceEquals(this.OccupationField, value) != true)) {
this.OccupationField = value;
this.RaisePropertyChanged("Occupation");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string PreviousName {
get {
return this.PreviousNameField;
}
set {
if ((object.ReferenceEquals(this.PreviousNameField, value) != true)) {
this.PreviousNameField = value;
this.RaisePropertyChanged("PreviousName");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<System.DateTime> ReviewDate {
get {
return this.ReviewDateField;
}
set {
if ((this.ReviewDateField.Equals(value) != true)) {
this.ReviewDateField = value;
this.RaisePropertyChanged("ReviewDate");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Status {
get {
return this.StatusField;
}
set {
if ((object.ReferenceEquals(this.StatusField, value) != true)) {
this.StatusField = value;
this.RaisePropertyChanged("Status");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.CustomerServiceWSDL.LookupItem Title {
get {
return this.TitleField;
}
set {
if ((object.ReferenceEquals(this.TitleField, value) != true)) {
this.TitleField = value;
this.RaisePropertyChanged("Title");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="LookupItem", Namespace= + APIWEB)]
[System.SerializableAttribute()]
public partial class LookupItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string CodeField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string DisplayTextField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool IsActiveField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string Code {
get {
return this.CodeField;
}
set {
if ((object.ReferenceEquals(this.CodeField, value) != true)) {
this.CodeField = value;
this.RaisePropertyChanged("Code");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string DisplayText {
get {
return this.DisplayTextField;
}
set {
if ((object.ReferenceEquals(this.DisplayTextField, value) != true)) {
this.DisplayTextField = value;
this.RaisePropertyChanged("DisplayText");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public bool IsActive {
get {
return this.IsActiveField;
}
set {
if ((this.IsActiveField.Equals(value) != true)) {
this.IsActiveField = value;
this.RaisePropertyChanged("IsActive");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
That's cause purchaseOnHoldSetRequest.AdditionalDetail is an Array type (mostly, from your posted code) which you haven't initialized and trying to set an item in index 0 saying purchaseOnHoldSetRequest.AdditionalDetail[0].Description which will bound to throw NullRefException
Per your WSDL, the said property is array of AdditionalDetails class as seen below
[System.Runtime.Serialization.DataMemberAttribute()]
public Account_Status.ServiceReference2.AdditionalDetail[] AdditionalDetail {
get {
return this.AdditionalDetailField;
}
set {
if ((object.ReferenceEquals(this.AdditionalDetailField, value) != true)) {
this.AdditionalDetailField = value;
this.RaisePropertyChanged("AdditionalDetail");
}
}
}
Thus you need to initialize it first
purchaseOnHoldSetRequest.UserName = "username";
purchaseOnHoldSetRequest.Password = "password";
purchaseOnHoldSetRequest.SystemToken = "systemtoken";
purchaseOnHoldSetRequest.AgreementReference = customerAgreementNumberComboBox.Text;
purchaseOnHoldSetRequest.AdditionalDetail = new AdditionalDetail[3]; // here
And then access it likewise you are doing
purchaseOnHoldSetRequest.AdditionalDetail[0] = new AdditionalDetail();
purchaseOnHoldSetRequest.AdditionalDetail[0].Description = "1";

mvvm selected listview items to list<string> in object

I have a MVVM program with a model:
public class Deelnemer
{
public int Id { get; set; }
public string Voornaam { get; set; }
public string Werkplek { get; set; }
public List<string> Aanwezig { get; set; }
public Deelnemer()
{
}
}
In my View I have a listBox in which I want to be able to select multiple values (days to put in the list aanwezig).
<ListBox Name="listDagdelen" SelectionMode="Multiple" ItemsSource="{Binding Dagdelen}" SelectedItem="{Binding SelectedDagdeel, Mode=TwoWay}">
The ViewModel looks as follows:
class DeelnemerViewModel : INotifyPropertyChanged
{
#region Private Variables
private readonly Deelnemer dlnObject;
private readonly ObservableCollection<Deelnemer> deelnemers;
private readonly DeelnemerManager deelnemerManager;
private readonly ICommand addDeelnemerCmd;
private readonly ICommand deleteDeelnemerCmd;
#endregion
public ObservableCollection<string> Dagdelen { get; private set; }
#region constructor
public DeelnemerViewModel()
{
Dagdelen = new ObservableCollection<string>() { "maandagochtend", "maandagmiddag", "dinsdagochtend", "dinsdagmiddag", "woensdagochtend", "woensdagmiddag", "donderdagochtend", "donderdagmiddag", "vrijdagochtend", "vrijdagmiddag" };
dlnObject = new Deelnemer();
deelnemerManager = new DeelnemerManager();
deelnemers = new ObservableCollection<Deelnemer>();
addDeelnemerCmd = new RelayCommand(Add, CanAdd);
deleteDeelnemerCmd = new RelayCommand(Delete, CanDelete);
}
#endregion
#region Properties
private string _selectedDagdeel = null;
public string SelectedDagdeel
{
get { return _selectedDagdeel; }
set
{
_selectedDagdeel = value;
dlnObject.Aanwezig.Add(value);
OnPropertyChanged("SelectedDagdeel");
}
}
public int Id
{
get { return dlnObject.Id; }
set
{
dlnObject.Id = value;
OnPropertyChanged("Id");
}
}
public string Voornaam
{
get { return dlnObject.Voornaam; }
set
{
dlnObject.Voornaam = value;
OnPropertyChanged("Voornaam");
}
}
public string Werkplek
{
get { return dlnObject.Werkplek; }
set
{
dlnObject.Werkplek = value;
OnPropertyChanged("Werkplek");
}
}
public List<string> Aanwezig
{
get { return dlnObject.Aanwezig; }
set
{
dlnObject.Aanwezig = value;
OnPropertyChanged("Aanwezig");
}
}
public ObservableCollection<Deelnemer> Deelnemers { get { return deelnemers; } }
public Deelnemer SelectedDeelnemer
{
set
{
Id = value.Id;
Voornaam = value.Voornaam;
Werkplek = value.Werkplek;
Aanwezig = value.Aanwezig;
}
}
#endregion
#region Commands
public ICommand AddDeelnemerCmd { get { return addDeelnemerCmd; } }
public ICommand DeleteDeelnemerCmd { get { return deleteDeelnemerCmd; } }
#endregion
public bool CanAdd(object obj)
{
//Enable the Button only if the mandatory fields are filled
if (Voornaam != string.Empty && Werkplek != string.Empty)
return true;
return false;
}
public void Add(object obj)
{
var deelnemer = new Deelnemer { Voornaam = Voornaam, Werkplek = Werkplek, Aanwezig = Aanwezig };
if (deelnemerManager.Add(deelnemer))
{
Deelnemers.Add(deelnemer);
//string txt = string.Join(String.Empty,Aanwezig);
//MessageBox.Show(txt);
//ResetDeelnemer();
}
else
MessageBox.Show("Vul correcte waardes in!");
}
#region DeleteCommand
private bool CanDelete(object obj)
{
//Enable the Button only if the patients exist
if (Deelnemers.Count > 0)
return true;
return false;
}
private void Delete(object obj)
{
//Delete patient will be successfull only if the patient with this ID exists.
if (!deelnemerManager.Remove(Id))
MessageBox.Show("Deelnemer met dit id bestaat niet!");
else
{
//Remove the patient from our collection as well.
deelnemers.RemoveAt(GetIndex(Id));
ResetDeelnemer();
MessageBox.Show("Deelnemer succesvol verwijderd !");
}
}
#endregion
#region Private Methods
private void ResetDeelnemer()
{
Id = 0;
Voornaam = string.Empty;
Werkplek = string.Empty;
Aanwezig.Clear();
}
private int GetIndex(int Id)
{
for (int i = 0; i < Deelnemers.Count; i++)
if (Deelnemers[i].Id == Id)
return i;
return -1;
}
#endregion
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
I can't figure out how I should use the List with the listbox values. How do I add (multiple) listbox values to the object's List?
The current code throws a nullreferenceexception at
dlnObject.Aanwezig.Add(value);
You must initialize the Aanwezig property of the Deelnemer object before you can add any values to it, either in the contructor of DeelnemerViewModel:
dlnObject = new Deelnemer();
dlnObject.Aanwezig = new List<string();
...or in the constructor of the Deeelnemer class:
public Deelnemer()
{
Aanwezig = new List<string();
}

Getting new items added to an Observable Collection of a custom class

I have a set of classes that I am using to deserialize JSON into. My program will periodically look for changes to this JSON file, and if it finds any, will push the new data to the properties of these classes using reflection.
I need to find any new items added to the collection of the Item2 class (SocialExportJSON.SocialExportData.Item2) after a successful update.
My JSON classes look like this (there are more but I want to avoid too big a wall of code):
public class Item2 : INotifyPropertyChanged
{
[JsonProperty("type")]
private string type;
public string Type
{
get
{
return type;
}
set
{
if (type != value)
{
type = value;
RaisePropertyChanged("Type");
}
}
}
[JsonProperty("id")]
private string id;
public string ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("postedIso8601")]
private string postedIso8601;
public string PostedIso8601
{
get
{
return postedIso8601;
}
set
{
if (postedIso8601 != value)
{
postedIso8601 = value;
RaisePropertyChanged("PostedIso8601");
}
}
}
[JsonProperty("postedTimestamp")]
private object postedTimestamp;
public object PostedTimestamp
{
get
{
return postedTimestamp;
}
set
{
if (postedTimestamp != value)
{
postedTimestamp = value;
RaisePropertyChanged("PostedTimestamp");
}
}
}
[JsonProperty("engagement")]
private Engagement engagement;
public Engagement Engagement
{
get
{
return engagement;
}
set
{
if (engagement != value)
{
engagement = value;
RaisePropertyChanged("Engagement");
}
}
}
[JsonProperty("source")]
private Source2 source;
public Source2 Source
{
get
{
return source;
}
set
{
if (source != value)
{
source = value;
RaisePropertyChanged("Source");
}
}
}
[JsonProperty("author")]
private Author author;
public Author Author
{
get
{
return author;
}
set
{
if (author != value)
{
author = value;
RaisePropertyChanged("Author");
}
}
}
[JsonProperty("content")]
private Content content;
public Content Content
{
get
{
return content;
}
set
{
if (content != value)
{
content = value;
RaisePropertyChanged("Content");
}
}
}
[JsonProperty("location")]
private Location location;
public Location Location
{
get
{
return location;
}
set
{
if (location != value)
{
location = value;
RaisePropertyChanged("Location");
}
}
}
[JsonProperty("publication")]
private Publication publication;
public Publication Publication
{
get
{
return publication;
}
set
{
if (publication != value)
{
publication = value;
RaisePropertyChanged("Publication");
}
}
}
[JsonProperty("metadata")]
private Metadata metadata;
public Metadata Metadata
{
get
{
return metadata;
}
set
{
if (metadata != value)
{
metadata = value;
RaisePropertyChanged("Metadata");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
public class SocialExportData : INotifyPropertyChanged
{
[JsonProperty("dataType")]
private string dataType;
public string DataType
{
get
{
return dataType;
}
set
{
if (dataType != value)
{
dataType = value;
RaisePropertyChanged("DataType");
}
}
}
[JsonProperty("id")]
private int id;
public int ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("story")]
private Story story;
public Story Story
{
get
{
return story;
}
set
{
if (story != value)
{
story = value;
RaisePropertyChanged("Story");
}
}
}
[JsonProperty("order")]
private string order;
public string Order
{
get
{
return order;
}
set
{
if (order != value)
{
order = value;
RaisePropertyChanged("Order");
}
}
}
[JsonProperty("lifetime")]
private string lifetime;
public string Lifetime
{
get
{
return lifetime;
}
set
{
if (lifetime != value)
{
lifetime = value;
RaisePropertyChanged("Lifetime");
}
}
}
[JsonProperty("maxAge")]
private int maxAge;
public int MaxAge
{
get
{
return maxAge;
}
set
{
if (maxAge != value)
{
maxAge = value;
RaisePropertyChanged("MaxAge");
}
}
}
[JsonProperty("maxSize")]
private int maxSize;
public int MaxSize
{
get
{
return maxSize;
}
set
{
if (maxSize != value)
{
maxSize = value;
RaisePropertyChanged("MaxSize");
}
}
}
[JsonProperty("consumeCount")]
private int consumeCount;
public int ConsumeCount
{
get
{
return consumeCount;
}
set
{
if (consumeCount != value)
{
consumeCount = value;
RaisePropertyChanged("ConsumeCount");
}
}
}
[JsonProperty("consumeInterval")]
private int consumeInterval;
public int ConsumeInterval
{
get
{
return consumeInterval;
}
set
{
if (consumeInterval != value)
{
consumeInterval = value;
RaisePropertyChanged("ConsumeInterval");
}
}
}
[JsonProperty("items")]
private ObservableCollection<Item2> items;
public ObservableCollection<Item2> Items
{
get
{
return items;
}
set
{
if (items != value)
{
items = value;
RaisePropertyChanged("Items");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
public class SocialExportJSON : INotifyPropertyChanged
{
[JsonProperty("id")]
private string id;
public string ID
{
get
{
return id;
}
set
{
if (id != value)
{
id = value;
RaisePropertyChanged("ID");
}
}
}
[JsonProperty("ttl")]
private int ttl;
public int TTL
{
get
{
return ttl;
}
set
{
if (ttl != value)
{
ttl = value;
RaisePropertyChanged("TTL");
}
}
}
[JsonProperty("serial")]
private long serial;
public long Serial
{
get
{
return serial;
}
set
{
if (serial != value)
{
serial = value;
RaisePropertyChanged("Serial");
}
}
}
[JsonProperty("formatType")]
private string formatType;
public string FormatType
{
get
{
return formatType;
}
set
{
if (formatType != value)
{
formatType = value;
RaisePropertyChanged("FormatType");
}
}
}
[JsonProperty("modifiedIso8601")]
private string modifiedIso8601;
public string ModifiedIso8601
{
get
{
return modifiedIso8601;
}
set
{
if (modifiedIso8601 != value)
{
modifiedIso8601 = value;
RaisePropertyChanged("ModifiedIso8601");
}
}
}
[JsonProperty("modifiedTimestamp")]
private long modifiedTimestamp;
public long ModifiedTimestamp
{
get
{
return modifiedTimestamp;
}
set
{
if (modifiedTimestamp != value)
{
modifiedTimestamp = value;
RaisePropertyChanged("ModifiedTimestamp");
}
}
}
[JsonProperty("timezone")]
private string timezone;
public string Timezone
{
get
{
return timezone;
}
set
{
if (timezone != value)
{
timezone = value;
RaisePropertyChanged("Timezone");
}
}
}
[JsonProperty("dataType")]
private string dataType;
public string DataType
{
get
{
return dataType;
}
set
{
if (dataType != value)
{
dataType = value;
RaisePropertyChanged("DataType");
}
}
}
[JsonProperty("exports")]
private ObservableCollection<SocialExportData> exports;
public ObservableCollection<SocialExportData> Exports
{
get
{
return exports;
}
set
{
if (exports != value)
{
exports = value;
RaisePropertyChanged("Exports");
}
}
}
//Event handling
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
//Console.WriteLine("Updated");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
In another class, I have a method to deserialize to a global instance of my JSON class. It looks like this:
public SocialExportJSON socialExportData;
private async void DownloadAndDeserializeJSONAsync()
{
try
{
//Create a web client with the supplied credentials
var exportClient = new WebClient { Credentials = new NetworkCredential(uName, pw), Encoding = Encoding.UTF8};
//Create a task to download the JSON string and wait for it to finish
var downloadTask = Task.Run(() => exportClient.DownloadString(new Uri(eURL)));
downloadTask.Wait();
//Get the string from the task
var JSONString = await downloadTask;
//Create a task to deserialize the JSON from the last task
var DeserializeTask = Task.Run(() => JsonConvert.DeserializeObject<SocialExportJSON>(JSONString));
DeserializeTask.Wait();
SocialExportJSON sej = await DeserializeTask;
//Check the timestamp first to see if we should change the data
if(socialExportData == null)
{
//Get the data from the task
socialExportData = await DeserializeTask;
}
else if(sej.ModifiedTimestamp != socialExportData.ModifiedTimestamp)
{
//Get the data from the task
SocialExportJSON newData = await DeserializeTask;
GetNewItems(newData);
SetNewData(newData);
//Call the exportUpdated event when the task has finished
exportUpdated();
}
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
}
}
In my SetNewData function, shown below, I use reflection to set the properties of my global class. Because I'm setting the whole collection rather than iterating through each of the properties in each of the classes, I can't use the CollectionChanged event to find new items.
public void SetNewData(SocialExportJSON newData)
{
//Loop through each of the properties and copy from source to target
foreach (PropertyInfo pi in socialExportData.GetType().GetProperties())
{
if (pi.CanWrite)
{
pi.SetValue(socialExportData, pi.GetValue(newData, null), null);
}
}
}
Is there a way I can modify my SetNewData function in such a way that it calls CollectionChanged? If not, what would be the best way to go about getting any new additions to my collection of Item2?
In my Main function. I create an instance of my class called SocialExport like so:
SocialExport s = new SocialExport("http://example.json", "example", "example");.
This class is where the global instance of my JSON class is contained, and my event handler is added like so
s.socialExportData.Exports[0].Items.CollectionChanged += CollectionChanged;
Then you are hooking up an event handler for the CollectionChanged event for that particular instance of ObservableCollection<Item2>.
If you create a new ObservableCollection<Item2>, you obviously must hook up an event handler to this one as well. The event handler that is associated with the old object won't be invoked when new items are added to the new instance.
So whenever a new ObservableCollection<Item2> is created, using deserialization or not, you should hook up a new event handler.
You could probably do this in your DownloadAndDeserializeJSONAsync method. The other option would be to create only one instance of the collection and remove and add items from/to this one.

Why won't my SOAP XML response deserialize in C#?

My soap service call is returning the following response:
<AssetList xmlns="http://schemas.datacontract.org/2004/07/XOSDigital.Assets" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Facets xmlns:a="http://schemas.datacontract.org/2004/07/XOSDigital.Business_Classes.Search"/>
<Results/>
<err i:nil="true"/>
<offset>0</offset>
<total>0</total>
</AssetList>
When I attempt to serialize this via:
AssetList assets;
var serializer = new XmlSerializer(typeof(AssetList));
assets = (AssetList)serializer.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(response.Content)));
I get the following exception:
<AssetList xmlns='http://schemas.datacontract.org/2004/07/XOSDigital.Assets'> was not expected.
The AssetList object I am trying to deserialize to was automatically generated by updating my service reference against the same exact service I am calling with my GET request.
Why is this failing?
The AssetList class is generated as:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AssetList", Namespace="http://schemas.datacontract.org/2004/07/XOSDigital.Assets")]
[System.SerializableAttribute()]
public partial class AssetList : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.NonSerializedAttribute()]
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] FacetsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] ResultsField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string errField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int offsetField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int totalField;
[global::System.ComponentModel.BrowsableAttribute(false)]
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] Facets {
get {
return this.FacetsField;
}
set {
if ((object.ReferenceEquals(this.FacetsField, value) != true)) {
this.FacetsField = value;
this.RaisePropertyChanged("Facets");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] Results {
get {
return this.ResultsField;
}
set {
if ((object.ReferenceEquals(this.ResultsField, value) != true)) {
this.ResultsField = value;
this.RaisePropertyChanged("Results");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string err {
get {
return this.errField;
}
set {
if ((object.ReferenceEquals(this.errField, value) != true)) {
this.errField = value;
this.RaisePropertyChanged("err");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int offset {
get {
return this.offsetField;
}
set {
if ((this.offsetField.Equals(value) != true)) {
this.offsetField = value;
this.RaisePropertyChanged("offset");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int total {
get {
return this.totalField;
}
set {
if ((this.totalField.Equals(value) != true)) {
this.totalField = value;
this.RaisePropertyChanged("total");
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
I think the problem is related with namespaces.
Can you try this?
var serializer = new XmlSerializer(typeof(AssetList),"http://schemas.datacontract.org/2004/07/XOSDigital.Assets");
Try to add this as the first line in your xml:
<?xml version="1.0"?>
Also, add XmlRoot attribute with namespace to your AssetList class:
[XmlRoot("AssetList", Namespace = "http://schemas.datacontract.org/2004/07/XOSDigital.Assets")]

Categories

Resources