【问题标题】:Xamarin Forms two way binding ActivityIndicatorXamarin Forms 两种方式绑定ActivityIndi​​cator
【发布时间】:2017-08-28 08:50:44
【问题描述】:

我是 Xamarin 的新手,我正在使用 ActivityIndi​​cator 告诉用户该应用正在下载数据。问题是我正在使用 MVVM 模式,我需要从 ViewModel 设置值 IsRunningIsVisible。我的观点很简单:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:HmtMobile"
         x:Class="HmtMobile.MainPage"
         Title="Přihlášení"
         >
<ScrollView>
    <StackLayout Margin="10" Spacing="15" VerticalOptions="Center">
        <ActivityIndicator x:Name="ActivityIndicator" Color="Green" IsRunning="{Binding IsBusy, Mode=TwoWay}" IsVisible="{Binding IsBusy, Mode=TwoWay}"/>
        <Entry Placeholder="Uživatelské jméno" Text="{Binding UserName}"></Entry>
        <Entry Placeholder="Heslo" Text="{Binding Password}" IsPassword="True"></Entry>
        <Button Text="Přihlášení" Command="{Binding LoginCommand}" BackgroundColor="#77D065" TextColor="White"></Button>
    </StackLayout>
</ScrollView>

在视图构造函数中,我分配了BindingContext

public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new CredentialViewModel(this);
    }

其他属性有效,因为当我想登录时,属性返回实际的用户名和密码,但双向绑定没有。属性被声明为相同,所以我不明白为什么会这样。

 private string password;
public string Password
    {
        get { return password; }
        set { password = value; OnPropertyChanged(); }
    }
    private bool isBusy;

    public bool IsBusy
    {
        get { return isBusy; }
        set { isBusy = value; OnPropertyChanged(); }
    }

我正在使用简单的登录方法。

private async Task Login()
    {
        IsBusy = true;
        await Task.Delay(5000);
   }

ActivityIndicator 没有出现。有谁知道为什么? OnPropertyCHanged 是这样编码的:

 public class Bindable
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

【问题讨论】:

  • 为什么必须是 TwoWay?对于您正在做的事情,默认(OneWay)就足够了。尝试删除 TwoWay 声明,看看它是否有效。
  • 你确定吗?我需要在 VM 中设置值并填充它以在我尝试将其更改为 OneWay 时对其进行查看,但它无法识别代码中的更改。
  • OneWay 表示当您从 BindingContext 设置它时,它应该在 UI 中相应更新。如果未正确更新,则您的 NotifyPropertyChanged 机制可能有问题。
  • OnPropertyChanged 的​​编码方式与我在问题更新中显示的方式相同。
  • 您的 ViewModel 中是否定义了 INotifyProeprtyChanged ?不知道为什么它在一个叫做 Bindable 的类中......或者你的 ViewModel 是从那个派生的?简单地这样做:public class CredentialViewModel : INotifyPropertyChanged

标签: c# xamarin mvvm data-binding xamarin.forms


【解决方案1】:

我是根据 Felix 的消息弄清楚的。问题是在Bindable 类中我忘了添加:INotifyPropertyChanged

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 2015-02-24
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多