2017-12-18 7 views
0

私はクラスのようなBindingContextのページを持っています。Xamarinはクラスプロパティを持つコンテキストをバインドします

private WorkOrderDettaglioSpesa _WoSpesaDett = new WorkOrderDettaglioSpesa(); 
public WorkOrderDettaglioSpesa WoSpesaDett { 
    get { return _WoSpesaDett; } 
    set { 
     _WoSpesaDett = value; 
     RaisePropertyChanged(() => WoSpesaDett); 
    } 
} 

BindingContext="{Binding .}"BindingContextです。私はこの方法でこれを使用するXAMLページで

<Label Text="{core:Translate LbLImporto}" 
     Grid.Row="0" 
     Grid.Column="0" 
     Style="{StaticResource LblDescrizione}" />   
<Entry IsEnabled="{Binding WoSpesaDett.DatiArticoloSelezionato.AbilitaImporto}" 
     Keyboard="Numeric" 
     Text="{Binding WoSpesaDett.Importo, Mode=TwoWay}" 
     Grid.Row="0" 
     Grid.Column="1" > 
</Entry> 

のViewModelインサイド私はこのエントリは、それが価値だ変更し、値をチェックしますが、値は常に最初にあるトリガーである機能を持っています設定された値。

private void ControllaMassimale() 
{ 
    if (!string.IsNullOrWhiteSpace(WoSpesaDett.LimitePerSingolaSpesa)) 
    { 
     RaisePropertyChanged(() => WoSpesaDett); 

     double? Massimale = Convert.ToDouble(WoSpesaDett.LimitePerSingolaSpesa); 
     double? Valore = WoSpesaDett.Importo/WoSpesaDett.Quantita; // <<-- WoSpesaDett.Importo is always 0 (the default value) 

     if (Valore != null && Valore > Massimale) 
     { 
      WoSpesaDett.FuoriMassimale = true; 
      var Params = new { 
       Titolo = "MyTitle", 
       Messaggio = "MyMessaggio", 
      }; 

      MessagingCenter.Send(Me, Costanti.ChiaviMessaggi.MessaggioGenerico.ToString(), Params); 
     } 
     else 
      WoSpesaDett.FuoriMassimale = false; 
    } 
} 

私は間違っていますか? 入力の値が変更されたとき、自分のクラスのそれぞれのプロパティが更新されないのはなぜですか?

ありがとうございました!

EDIT - 私のコードのクラスがあります。

WorkOrderDettaglioSpesa

public class WorkOrderDettaglioSpesa : WorkOrderDettaglioListaSpese { 

    public class DatiTipoSpesa { 
     public string UnitaDiMisura { get; set; } = string.Empty; // TBS TRT str1 
     public bool MassimaliSiNo { get; set; } = false; // str2 
     public bool AbilitaQuantita { get; set; } = false; // str3 
     public string PagamentoDiDefault { get; set; } = string.Empty; // str4 
     public bool AbilitaPagamento { get; set; } = true; // str5 
     public bool KmSiNo { get; set; } = false; // str7 
     public string CostoTRX { get; set; } = string.Empty; // str8 
     public bool AbilitaImporto { get; set; } = false;// Mi serve per il template 
     public bool AbilitaTipoSpesa { get; set; } = false;// Mi serve per il template 
    } 

    public string DaFatturare { get; set; } 
    public string DaFatturareDefault { get; set; } // Serve per fare i controlli al cambio del check 
    public string NotaFatturare { get; set; } 
    public string LimitePerSingolaSpesa { get; set; } 

    [IgnoreMapping] 
    public DatiTipoSpesa DatiArticoloSelezionato { get; set; } = new DatiTipoSpesa(); 

    #region Installatore 
    public string Installatore_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo Installatore { 
     get { 
      Combo wRet = new Combo(); 
      if (DsInstallatore != null) wRet = DsInstallatore.Find(ele => ele.Codice == Installatore_Cod); 
      return wRet; 
     } 
     set { if (value != null) Installatore_Cod = value.Codice; } 
    } 
    #endregion 

    #region Tecnico 
    public string Tecnico_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo Tecnico { 
     get { 
      Combo wRet = new Combo(); 
      if (DsTecnico != null) wRet = DsTecnico.Find(ele => ele.Codice == Tecnico_Cod); 
      return wRet; 
     } 
     set { if (value != null) Tecnico_Cod = value.Codice; } 
    } 
    #endregion 

    #region AreaSpesa 
    public string AreaSpesa_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo AreaSpesa { 
     get { 
      Combo wRet = new Combo(); 
      if (DsAreaSpesa != null) wRet = DsAreaSpesa.Find(ele => ele.Codice == AreaSpesa_Cod); 
      return wRet; 
     } 
     set { if (value != null) AreaSpesa_Cod = value.Codice; } 
    } 
    #endregion 

    #region TipoSpesa 
    public string TipoSpesa_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo TipoSpesa { 
     get { 
      Combo wRet = new Combo(); 
      if (DsTipoSpesa != null) wRet = DsTipoSpesa.Find(ele => ele.Codice == TipoSpesa_Cod); 
      return wRet; 
     } 
     set { if (value != null) TipoSpesa_Cod = value.Codice; } 
    } 
    #endregion 

    #region Valuta 
    public string Valuta_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo Valuta { 
     get { 
      Combo wRet = new Combo(); 
      if (DsValuta != null) wRet = DsValuta.Find(ele => ele.Codice == Valuta_Cod); 
      return wRet; 
     } 
     set { if (value != null) Valuta_Cod = value.Codice; } 
    } 
    #endregion 

    #region TipoPagamento 
    public string TipoPagamento_Cod { get; set; } 
    [IgnoreMapping] 
    public Combo TipoPagamento { 
     get { 
      Combo wRet = new Combo(); 
      if (DsTipoPagamento != null) wRet = DsTipoPagamento.Find(ele => ele.Codice == TipoPagamento_Cod); 
      return wRet; 
     } 
     set { if (value != null) TipoPagamento_Cod = value.Codice; } 
    } 
    #endregion 

    #region DataSource Combo 
    [IgnoreMapping] 
    public List<Combo> DsInstallatore { get; set; } 

    [IgnoreMapping] 
    public List<Combo> DsTecnico { get; set; } 

    [IgnoreMapping] 
    public List<Combo> DsAreaSpesa { get; set; } 

    [IgnoreMapping] 
    public List<Combo> DsTipoSpesa { get; set; } 

    [IgnoreMapping] 
    public List<Combo> DsValuta { get; set; } 

    [IgnoreMapping] 
    public List<Combo> DsTipoPagamento { get; set; } 
    #endregion 
} 

BaseModel

public class WorkOrderDettaglioListaSpese : BaseModel { 
    public DateTime? DataSpesa { get; set; } 

    public string InstallatoreTecnico { 
     get { 
      return string.Join(" ", _Installatore, _Tecnico); 
     } 
    } 

    public string TipoSpesaDescrizione { get; set; } // codart_descr 
    public string SpesaValore { 
     get { 
      return $"{SpeseViaggioDescrizione} {Quantita}"; 
     } 
    } 

    public string SpesaImporto { 
     get { 

      string wRet = string.Empty; 

      string FuoriMassimaleTemplate = "FUORI-MAX"; 
      string NoCambioTemplate = "NO-CAMBIO"; 

      if (FuoriMassimale) { 
       wRet = $"{Importo?.ToString("F2")} {ValutaDescrizione} {FuoriMassimaleTemplate}"; 
      } else { 
       wRet = $"{Importo?.ToString("F2")} {ValutaDescrizione}"; 
      } 

      if (NoCambio) wRet += $" {NoCambioTemplate}"; 

      return wRet; 
     } 
    } 

    public string SpeseViaggioDescrizione { get; set; } // cod_trt_descr 
    public string ValutaDescrizione { get; set; } // cod_val_descr 

    public double? Quantita { get; set; } = 1; // qta 
    public double? Importo { get; set; } 

    public string _Installatore { get; set; } 
    public string _Tecnico { get; set; } 
    public bool Rimborsata { get; set; } 
    public bool FuoriMassimale { get; set; } 
    public bool NoCambio { get; set; } 
} 

をWorkOrderDettaglioListaSpese

public class BaseModel { internal TranslateExtension ts = new TranslateExtension(); public string Cod_div { get; set; } public string Cod_soc { get; set; } public string Cod_fil { get; set; } public string Guid_servizio { get; set; } public string FlagTratt { get; set; } public bool IsNew { get { return string.IsNullOrWhiteSpace(Guid_servizio); } } internal class FiltroAttribute : Attribute { } internal class IgnoreMappingAttribute : Attribute { } private static IEnumerable<T> ReflectionFilter<T>(IEnumerable<T> collection, string property, object value) { if (collection.Count() == 0) return new List<T>(); PropertyInfo pInfo = collection.First().GetType().GetProperty(property); return collection.Where(c => ((string)pInfo.GetValue(c))?.IndexOf((string)value, StringComparison.InvariantCultureIgnoreCase) > -1).ToList(); } public static List<T> FiltraListaTipizzata<T>(List<T> ListaDaFiltrare, string Filtro) { try { List<T> wRet = new List<T>(); Type Classe = typeof(T); List<PropertyInfo> PropToFilter = Classe.GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(FiltroAttribute))).ToList(); // TODO: Da ottimizzare e cercare di utilizare il PredicateBuilder if (string.IsNullOrWhiteSpace(Filtro)) { wRet = ListaDaFiltrare; } else { foreach (PropertyInfo Prop in PropToFilter) { IEnumerable<T> TmpList = ReflectionFilter(ListaDaFiltrare, Prop.Name, Filtro); wRet = wRet.Union(TmpList).ToList(); } } return wRet; } catch (Exception ex) { throw ex; } } } 
+0

はWoSpesaDettがあなたのBindingContextをであれば、あなただけの ''エントリでIsEnabled = "{バインディングDatiArticoloSelezionato.AbilitaImportoを}" 記述する必要があり、同じことが{​​Importoバインディング」= 'テキストのために行きます、Mode = TwoWay} "' – Csharpest

+0

返信いただきありがとうございます!申し訳ありませんが、私のBindingContextは:BindingContext = "{Binding。}" – Hikari

答えて

1

クラスWoSpesaDettはINPCから継承しています。しかし、それはクラス内のpropertyが変更されたときにビューを更新しません。 WoSpesaDettのプロパティは、INotifyPropertyChangedイベントを呼び出す必要があります。

したがって、このような何か:

public class WoSpesaDett : INotifyPropertyChanged 
{ 

    private string importo; 
    public string Importo 
    { 
     get { return fuoriMassimale; } 
     set 
     { 
      fuoriMassimale = value; 
      OnPropertyChanged(); 
     } 
    } 
} 
+0

ありがとうございます。しかし、私のクラスは多くのプロパティを持っている、私は各プロパティのためにこれを行う必要がありますか? – Hikari

+0

はい、ビューで更新したい各プロパティに対してこれを行う必要があります – Csharpest

+0

しかし、他のプロパティは正しく変更されます。これは、WoSpesaDettの基底クラスでは "importo"という特質が宣言されているからです。 WoSpesaDettのタイプはWorkOrderDettaglioListaSpeseによって導出されるWorkOrderDettaglioSpesaであり、「importo」はWor​​kOrderDettaglioListaSpeseクラスにあります。 – Hikari

関連する問題