绑定到函数

时间:2017-03-09 23:10:34

标签: mvvm uwp uwp-xaml template10

我们正在使用UWP和Template10。 Template10.ViewModelBase管理变更通知。我们CostTextBlock绑定了ViewModel.Cost。在CostTextBlock更新时使用转换器ViewModel.Cost进行更新。当我们绑定到一个函数时,Cost以正确的格式呈现,但不会更新。 在ViewModel中我们有:

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的其他地方,我们更新Cost:

this.Cost = null;

在App.xaml中我们定义了转换器:

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

在视图中:

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

我们可以使用订单加载视图,并正确地显示成本。使用转换器,当Cost设置为null时,更改将反映在视图中。

我们还有一种与转换器相同的方法:

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}"

这可以在视图中正确格式化Cost,但是即使Cost已更新,与转换器this.Cost = null;一起使用的相同代码也不会更新视图。

为什么CostTextBlockViewModel.Cost绑定时不会反映FormatPrice的更新?

1 个答案:

答案 0 :(得分:0)

此问题发生在从viewmodel更新的一些属性中。我设法使用RaisePropertyChanged(nameof(<property>));

解决了这个问题

ViewModelBase用于处理更改通知,并且似乎在控件绑定到属性的所有情况下都这样做。如果有人能够提出一个更好的解决方案或解释为什么在控件绑定到函数的少数情况下不会触发更改通知,我很乐意将它们标记为答案。