【问题标题】:Xamarin.Forms DataBinding not workingXamarin.Forms 数据绑定不起作用
【发布时间】:2018-12-09 18:01:39
【问题描述】:

我知道这个问题以前已经被问过很多次了,但是每种情况都有点“独特”,让我们这样说吧。

我的环境是 Visual Studio 15.7.4,使用更新到最新版本的所有 Nuget 包(首先是 Xamarin.Forms)。

问题是我创建了一个简单的绑定测试应用程序,绑定不再起作用了! 前段时间我已经使用 Xamarin.Forms 创建了一个 Android 应用程序,并且一切正常。 现在所有绑定都像“OneTime”一样工作,在开始时只设置一次,而不是在 UI 中更新(但仍会更新主 ViewModel 中的数据)。

我想知道这是否是一般的 Xamarin 问题,或者只是我做错了什么。 我已经尝试了所有可能的方法,但没有任何改变。

这是完整的代码(为了测试,创建一个 Xamarin.Forms 应用程序,并选择“共享项目”;我通常将所有逻辑应用程序代码放在项目的共享部分中):

App.cs

namespace App1
{
   public partial class App : Application
   {
    public static AppViewModel ViewModel { get; set; }

    public App ()
    {
        InitializeComponent();

        ViewModel = new AppViewModel();
        MainPage = new MainPage();
    }

    // Other App lifecycle methods
  }
}

AppViewModel.cs

namespace App1.ViewModels
{
  public class AppViewModel : BaseBind
  {
    public AppViewModel()
    {
        TestoProva = "---";
        BoolProva = false;
    }

    private string testoProva;
    public String TestoProva
    {
        get { return testoProva; }
        set
        {
            SetProperty(ref testoProva, value);
        }
    }

    private bool boolProva;
    public Boolean BoolProva
    {
        get { return boolProva; }
        set { SetProperty(ref boolProva, value); }
    }
  }
}

主页

<?xml version="1.0" encoding="utf-8" ?>
  <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:App1"
         xmlns:vm="clr-namespace:App1.ViewModels"
         x:Class="App1.MainPage">
  <ContentPage.BindingContext>
    <vm:AppViewModel/>
  </ContentPage.BindingContext>
  <StackLayout>
    <Label Text="{Binding TestoProva, Mode=OneWay}"/>
    <Button Text="Test" Clicked="Test"/>
  </StackLayout>
</ContentPage>

MainPage.cs

namespace App1
{
public partial class MainPage : ContentPage
{
    public static AppViewModel ViewModel => App.ViewModel;

    public MainPage()
    {
        InitializeComponent();
        BindingContext = ViewModel;
    }

    public void Test()
    {
        ViewModel.TestoProva = "TESTO CAMBIATO!!!";
    }
  }
}

BaseBind.cs

 namespace App1.ViewModels
 {
  public class BaseBind
  {
    public event PropertyChangedEventHandler PropertyChanged;

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

    protected bool SetProperty<T>(ref T storage, T value,
        [CallerMemberName] String propertyName = null)
    {
        if (object.Equals(storage, value)) return false;
        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }
  }
}

就是这样……一个简单的应用测试,因为我工作的那个也显示这个问题。

真的很想知道什么是错的..me 或 Xamarin 框架。

感谢大家的关注和耐心。

【问题讨论】:

    标签: xamarin data-binding xamarin.forms


    【解决方案1】:

    我尚未使用您的代码创建/运行测试项目,但看起来问题可能出在您的 BaseBind 类上。虽然您已经添加了必要的事件,但实际上并未将其标记为实现 INotifyPropertyChanged,这是绑定引擎为连接事件而寻找的内容。

    试试这个:

    namespace App1.ViewModels
     {
      public class BaseBind : System.ComponentModel.INotifyPropertyChanged
      {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        protected bool SetProperty<T>(ref T storage, T value,
            [CallerMemberName] String propertyName = null)
        {
            if (object.Equals(storage, value)) return false;
            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }
      }
    }
    

    【讨论】:

    • 谢谢!不记得界面了!我怎么会这么傻。现在它完美地工作了。再次感谢。
    【解决方案2】:

    您的 MainPage.cs 中的 Clicked 处理程序不应该像这样定义: public void Test(object sender, System.EventArgs e) { ... }?

    【讨论】:

    • 但它会触发。通过调试,我发现一切正常,但 UI 更新了!
    【解决方案3】:

    也许出于某种原因,您的 OnPropertyChanged(propertyName); 在运行时调用了 OnPropertyChanged(null);。在调试器中检查它。

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2019-04-29
      • 1970-01-01
      • 2015-11-12
      • 2022-01-14
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多