Xamarin.Forms绑定不更新标签ui

时间:2016-07-12 09:33:09

标签: c# xamarin binding xamarin.forms

我想将我的标签绑定到我的模型,但是该属性的实际值没有得到更新,我还实现了INotifyPropertyChanged

我在这里做错了吗?

我的模特

public string ErgebnisBasisPaketPreisString {
    get
    {

        return _ergebnisBasisPaketPreis = (BasisPaketPreis[(int) Basispaket] * (BasisPaketInterval + 1)).ToString("C0"); 
    }
    set
    {
        _ergebnisBasisPaketPreis = value;

        OnPropertyChanged(nameof(ErgebnisBasisPaketPreisString));
    }
}

我的标签:

<Label x:Name="LabelPreisBasispaketIntervall" 
       Text="{Binding ErgebnisBasisPaketPreisString}" 
       Grid.Column="3" 
       VerticalOptions="Center"/>

我正在将绑定上下文设置为我的内容页面。

ContentPage:

public partial class GeräteKonfiguration : ContentPage {

    public GeräteKonfiguration(User currentUser) {
        InitializeComponent();

        _currentUser = currentUser;
        Initialize();
    }

    private User _currentUser;
    private Gerät _currentGerät;

    private void Initialize() {


        _currentGerät = _currentUser.ServiceModuleAngebotObj.CurrentGerät;
        LabelPreisBasispaketIntervall.SetBinding(Label.TextProperty, _currentGerät.ErgebnisBasisPaketPreisString);
        LabelPreisBasispaketIntervall.BindingContext = _currentGerät;
        BindingContext = _currentGerät;
        ToolBarView.BackButton.Clicked += BackButtonOnClicked;
        ToolBarView.BackButton.Text = "blabla";
        ToolBarView.TitleText = _currentGerät.Anwendung + " - " + _currentGerät.Antriebsart +
                                " - " + _currentGerät.Baureihe + " - " + _currentGerät.Typ;
        LabelPreisBasispaketIntervall.Text = _currentGerät.ErgebnisBasisPaketPreisString;

    }
}

1 个答案:

答案 0 :(得分:1)

后面的代码中的这一行是通过将标签文本绑定到属性的任何值来覆盖绑定。

LabelPreisBasispaketIntervall.SetBinding(Label.TextProperty, _currentGerät.ErgebnisBasisPaketPreisString)

这不太可能是有效的绑定路径(可能是ErgebnisBasisPaketPreisString),因此绑定将不起作用。

然后,您可以在此处设置正确的初始值:

LabelPreisBasispaketIntervall.Text = _currentGerät.ErgebnisBasisPaketPreisString;

删除这两行,绑定应该有效 - 您的XAML看起来是正确的。

其次,您的属性getter不会使用您设置的值 - 您每次都会重新计算它。你的财产应该只是:

public string ErgebnisBasisPaketPreisString
{
    get { return _ergebnisBasisPaketPreisString; }
    set 
    {
        _ergebnisBasisPaketPreisString = value;
         OnPropertyChanged(nameof(ErgebnisBasisPaketPreisString));
    }
}

您可以在构造函数中设置初始计算值。或者坚持使用计算属性并提升依赖属性中更改的属性:

public string ErgebnisBasisPaketPreisString
{
    get { return BasisPaketPreis[(int) Basispaket] * (BasisPaketInterval + 1)).ToString("C0"); }
}

public string Basispaket
{
    get { return _basispaket; }
    set 
    {
        _basispaket = value;
         OnPropertyChanged(nameof(Basispaket));
         OnPropertyChanged(nameof(ErgebnisBasisPaketPreisString));
    }
}

// and similar for the other properties that are used in the computation