2017-03-09 29 views
1

Template10でUWPを使用しています。 Template10.ViewModelBaseは変更通知を管理します。我々は、ViewModel.Costに束縛されたCostTextBlockを持っています。 ViewModel.Costが更新されるとコンバータCostTextBlockが更新されます。関数にバインドすると、コストは正しい形式でレンダリングされますが、更新されません。UWP TextBlockは機能にバインドされても更新されません

public class ViewModel : ViewModelBase 
{ 

    decimal? _Cost = default(decimal?); 
    public decimal? Cost 
    { 
     get 
     { 
      return _Cost; 
     } 
     set 
     { 
      if (value == 0) value = null; 
      Set(ref _Cost, value); 
     } 
    } 

このほかのViewModelで私たちは、コスト更新:App.xamlで

this.Cost = null; 

を私たちは、コンバータを定義:ビューで

<T10Converters:StringFormatConverter x:Key="PriceConverter" Format="{}{0:N2}"/> 

私たちが持っているのViewModelで
Text="{x:Bind ViewModel.Cost,Mode=OneWay, Converter={StaticResource PriceConverter}}"/> 

オーダーとコストレンダリングのビューを読み込むことができます。コンバーターを使用すると、Costがnullに設定されていると、変更がビューに反映されます。

は、我々はまた、コンバータと同じことの方法があります:ビューのXAMLは、これは正しくビューでコストをフォーマット

Text="{x:Bind Helpers:Globalisation.FormatPrice(ViewModel.Cost),Mode=OneWay}" 

ある

public static string FormatPrice(decimal? price) 
{ 
    if (price == null) 
     return null; 
    return ((decimal)price).ToString("N2"); 
} 

その場合は、しかし、コンバーターthis.Cost = null;と同じコードを使用しても、コストが更新されてもビューは更新されません。

なぜViewModel.Costへの更新がFormatPriceにバインドされていると、CostTextBlockに更新が反映されないのですか?

+0

コストが* null *の場合にのみ機能しますか?コストが* null *の場合、何が起こるか/表示されるべきですか?コストがnullの場合は文字列を空にしないでください。 – Romasz

+0

@Romasz Costがnullの場合、ビューには空白のコストが表示されます。これはコンバータを使用する場合です。コントロールをFormatPriceにバインドすると、ビュー内のコストは更新されません。 String.Emptyを返すようにFormatPriceを変更すると、違いはありません。ビュー内のコストはまだ更新されません。 – Vague

+0

nullの場合は0.0を返すほうがよいでしょうか?第2に、コンバーターがどのように実装されているかを見ると、コンバータとスタティックメソッドの両方で動作するnullケースの理由として、 – mvermef

答えて

0

この問題は、viewmodelから更新されたいくつかのプロパティで発生しました。 RaisePropertyChanged(nameof(<property>));

ViewModelBaseは、変更通知を処理するためのものであり、コントロールがプロパティにバインドされているすべてのケースでそうであるようです。なぜなら、コントロールが関数に束縛されているこれらのいくつかのケースでは、変更通知がなぜ発生しないのか、誰かがより良い解決法や説明を思いつくことができれば、私はそれらをうれしく答えとしてマークします。

+0

例の 'if(value == 0)value = null;のように、setterで何らかの変換を行いますか?フィールドと値が等しくない場合にだけ 'Set'メソッドが' PropertyChanged'を起動するからです。 –

+0

これは正しい@TóthTibor.if(値!=値) { if(value == 0) value = null; – Vague

関連する問題