【问题标题】:How to pass a value from within a List up to a method? MessagingCenter?如何将列表中的值传递给方法?消息中心?
【发布时间】:2019-08-22 20:41:53
【问题描述】:

我已经为 SyncFusion 中的图表创建了一个 List 对象。我在列表创建结束时执行了一个计算,该计算得到列表中一个对象的最小值(即“关闭”),并将其归因于一个名为“AxisMinimum”的变量。效果很好。

我现在需要获取该变量的值并将其传递给另一个方法,然后该方法可以使用它并对图表进行调整。该方法称为“NumbericalAxis_ActualRangeChanged”。

尝试在“NumbericalAxis_ActualRangeChanged”方法中使用 AxisMinimum 会产生错误,因为它在当前上下文中不存在。使用 Messaging.Center 方法是否合适或有更好的方法?

[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{

    public MainPage()
    {
        InitializeComponent();
    }

    private void NumericalAxis_ActualRangeChanged(object sender, ActualRangeChangedEventArgs e)
    {
        e.ActualMinimum = AxisMinimum;
    }
}


public class SaleInfo
{
    public string date { get; set; }
    public string minute { get; set; }
    public string label { get; set; }
    public double high { get; set; }
    public double low { get; set; }
    public double open { get; set; }
    public double close { get; set; }
    public double average { get; set; }
    public int volume { get; set; }
    public double notional { get; set; }
    public int numberOfTrades { get; set; }
}

public class SalesViewModel
{
    public List<SaleInfo> SalesData { get; set; }

    public SalesViewModel()
    {
        SalesData = new List<SaleInfo>();

        SalesData.Add(new SaleInfo { date = "2019-08-16", minute = "09:30", label = "09:30 AM", high = 204.84, low = 204.05, open = 204.3, close = 904.75, average = 204.508, volume = 8709, notional = 1781061.51, numberOfTrades = 69 });
        SalesData.Add(new SaleInfo { date = "2019-08-16", minute = "09:31", label = "09:31 AM", high = 204.8, low = 204.46, open = 204.8, close = 904.5, average = 204.622, volume = 5783, notional = 1183329.75, numberOfTrades = 58 });
        SalesData.Add(new SaleInfo { date = "2019-08-16", minute = "09:32", label = "09:32 AM", high = 204.72, low = 204.34, open = 204.46, close = 904.36, average = 204.548, volume = 4468, notional = 913920.6, numberOfTrades = 50 });
        SalesData.Add(new SaleInfo { date = "2019-08-16", minute = "09:33", label = "09:33 AM", high = 204.41, low = 204.06, open = 204.39, close = 904.06, average = 204.243, volume = 1834, notional = 374581.99, numberOfTrades = 22 });

        double AxisMinimum = SalesData.Min(SaleInfo => SaleInfo.close);
    }
}

【问题讨论】:

  • 只需将 AxisMinimum 定义为 VM 上的公共属性,然后您就可以从其他类中引用它
  • 使用消息中心,你的虚拟机不应该像在其他视图模型中那样直接相互通信。提供它是有充分理由的;允许发布者在不知道任何接收者的情况下发送消息,反之亦然。
  • 嗨 Jason,如果我在 VM 中将 AxisMinimum 定义为 public,然后转到 NumericalAxis_ActualRangeChanged 方法,AxisMinimum 会生成一个错误,它在当前上下文中不存在。

标签: c# xamarin syncfusion


【解决方案1】:

感谢 Çöđěxěŕ,成功了。使用以下代码使其工作...

    public void NumericalAxis_ActualRangeChanged(object sender, ActualRangeChangedEventArgs e)
            {
                SalesViewModel p = new SalesViewModel();
                e.ActualMinimum = p.AxisMinimum;
             }

通过创建 SalesViewModel 对象的实例,我可以获取该变量并使用它。谢谢。

【讨论】:

    【解决方案2】:

    在上述解决方案中,没有为您提供正确的 AxisMinium 值(SaleInfo 中 Close 属性值的最小值)。因为每次,您都在创建一个新的 SalesViewModel 实例。

    SalesViewModel p = new SalesViewModel();

    已被修改

    public void NumericalAxis_ActualRangeChanged(object sender,ActualRangeChangedEventArgs e){
    
    SalesViewModel p = (sender as Axis).BindingContext as SalesViewModel;   
    if(p != null )
    {                   
      e.ActualMinimum = p.AxisMinimum;
    }}
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多