【问题标题】:Using a non-static value in a static method?在静态方法中使用非静态值?
【发布时间】:2020-09-30 10:31:57
【问题描述】:

我目前正在使用来自https://github.com/xabre/xamarin-bluetooth-le 的示例应用程序,它实时显示来自传感器的数据。我现在的目标是用这些数据显示一个图表,所以我使用的是 Microcharts 包。将以下代码与静态数据一起使用(并将列表声明为静态)时,图表工作正常,但是,当我尝试使用实时数据 (CharacteristicValue) 时出现错误:

错误 CS0120 非静态字段、方法或属性“CharacteristicDetailViewModel.entries”需要对象引用
错误 CS0236 字段初始化程序无法引用非静态字段、方法或属性“CharacteristicDetailViewModel.CharacteristicValueTemp”

我知道发生这种情况是因为数据在变化,但我想知道是否有任何解决方法可以用来实时显示数据?

在我的 ViewModel 中,我有:

 public List<ChartEntry> entries = new List<ChartEntry>
     {
         new ChartEntry(CharacteristicValue)
         {
             Color=SKColor.Parse("#FF1943"),
             Label ="January",
             ValueLabel = "200"
         },
         new ChartEntry(400)
         {
             Color = SKColor.Parse("00BFFF"),
             Label = "March",
             ValueLabel = "400"
         },

     };

在 .xaml.cs 文件中:

 public CharacteristicDetailPage()
    {
        
        InitializeComponent();

        ChartTest.Chart = new LineChart() 
            {
                Entries = CharacteristicDetailViewModel.entries,
                LineMode = LineMode.Straight,
                LineSize = 8,
                PointMode = PointMode.Square,
                PointSize = 18,
            };
    }

(是的,我知道这个图表现在没有意义,我只是想在它变得更复杂之前进行更新)

谢谢! :)

【问题讨论】:

  • 我认为最终您必须重新绑定数据,因此不需要静态列表。然后你只需使用模型绑定等。也看看这里:github.com/dotnet-ad/Microcharts/issues/30
  • static 和 readonly 不是一回事。我认为您在这里混淆了两者。静态列表可以更改其内容。除非您也将其声明为只读。
  • @Isparia 嗨,你曾经让这段代码工作吗?我已经尝试了几十次,但我从来没有得到“myApi”应该是什么,我尝试了很多变量,但 GetValuesAssync() 没有任何作用。我试图只使用 float[] 作为值,但屏幕上没有图表
  • 你需要将被调用的成员设为静态。

标签: c# visual-studio xamarin xamarin.forms viewmodel


【解决方案1】:

CharacteristicDetailViewModel.entries 不是静态成员。你需要一个CharacteristicDetailViewModel 的具体实例:

var myCharacteristicDetailVM = /*some initializing or retrieval logic of a concrete instance of the VM*/

然后:

ChartTest.Chart = new LineChart() 
{
    Entries = myCharacteristicDetail.entries /*a concrete instance of the VM*/, 
    LineMode = LineMode.Straight,
    LineSize = 8,
    PointMode = PointMode.Square,
    PointSize = 18,
};

也就是说,您似乎对 static 在 c# 中的实际含义有很深的误解。我建议你阅读主题here

【讨论】:

  • 嗨,我不太确定我是否理解您所说的 VM 的具体实例的一些初始化或检索逻辑 的意思,但我想类似 var myCharacteristicDetailVM = new特征DetailViewModel();?我记得过去遵循一些绑定教程,我应该在某个时候写这个,但是,因为我正在使用蓝牙,这个功能实际上需要一个适配器,所以我仍然无法让它工作:s github.com/xabre/xamarin-bluetooth-le/blob/master/Source/…(完整视图模型)
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多