2017-03-09 71 views
1

我們使用UWP和Template10。 Template10.ViewModelBase管理變更通知。我們有一個CostTextBlock綁定到ViewModel.CostViewModel.Cost更新時使用轉換器CostTextBlock更新。當我們綁定到一個函數時,Cost會以正確的格式呈現,但不會更新。 在視圖模型,我們有:當綁定到函數時,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); 
     } 
    } 

別處在視圖模型,我們更新成本:

this.Cost = null; 

在App.xaml中,我們定義轉換器:

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

在視圖:

Text="{x:Bind ViewModel.Cost,Mode=OneWay, Converter={StaticResource PriceConverter}}"/> 

我們可以使用訂單加載視圖並正確呈現成本。使用轉換器時,當「成本」設置爲空時,更改將反映在視圖中。

我們也有不一樣的轉換器的方法:

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

在這種情況下,在視圖中XAML是

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

這正確地格式化在視圖中的成本,但是即使更新成本,轉換器this.Cost = null;使用的相同代碼也不更新視圖。

爲什麼CostTextBlock不反映更新到ViewModel.Cost當它綁定到FormatPrice

+0

這是否意味着它僅在成本爲* null *時才起作用?當成本爲* null *時應該發生什麼?成本爲空時不應該爲空字符串? – Romasz

+0

@Romasz當成本爲空時,視圖應顯示空白成本。當我們使用轉換器時就是這種情況。當我將控件綁定到FormatPrice時,視圖中的成本不會更新。如果我將FormatPrice更改爲返回String.Empty,則沒有區別。成本仍然不會在視圖中更新。 – Vague

+0

在null情況下返回0.0會不會更好?其次,看看轉換器是如何實現的,它可能會啓發你作爲空轉換器與靜態方法相結合的原因。 – mvermef

回答

0

此問題發生在一些從視圖模型更新的屬性中。我設法解決這個問題,使用RaisePropertyChanged(nameof(<property>));

ViewModelBase是爲了處理變更通知,它似乎這樣做是在控件綁定到屬性的所有情況下。如果任何人都能想出一個更好的解決方案,或者解釋爲什麼變更通知在這些控件綁定到函數的少數情況下不能解決問題,我會很樂意將它們標記爲答案。

+0

你是否像你的例子中那樣在setter中做了一些轉換if(value == 0)value = null;'?僅僅因爲'Set'方法只在字段和值不等於時觸發'PropertyChanged'。 –

+0

這是正確的@TóthTibor.if(價值!= _Cost) { if(value == 0) value = null; – Vague