簡體   English   中英

為什么當我嘗試使用 MVVM Z3055DD729D79EAAE738 中的命令修改它時,在視圖 model 中我的 object 出現 null 錯誤?

[英]Why I get null error for my object in view model when I try to modify it with command in MVVM WPF?

我有一個奇怪的情況,我無法弄清楚。 我正在使用 MVVM 構建一個使用商業軟件中的 OAPI 的程序。 我在我的視圖模型中創建了該 API 的公共字段。 然后我創建了兩個方法並使用命令將它們綁定到我的 UI 中的兩個按鈕。 其中一種方法負責連接到 API,另一種方法負責從商業軟件中檢索數據。 第一種方法完成工作並連接到軟件。 但是當我調用第二個命令來檢索數據時,我收到一個錯誤,提示您的 object 是 null。 當我再次使用第一個命令時,它說我們已經連接,這意味着我的 object 不是 null。 但我仍然在第二種方法中遇到錯誤。 所有方法都是公共的,並在視圖模型中定義。

兩種方法都被命令調用

我看不出我在哪里犯了錯誤。 如果有人可以幫助我,我將不勝感激。 此致

在視圖模型中,我定義了 OAPI 所需的這些屬性

//dimension the ETABS Object as cOAPI type
    public ETABSv1.cOAPI myETABSObject { get; set; }
    public ETABS2016.cOAPI myETABSObject16 { get; set; }
    public ETABSv1.cSapModel mySapModel { get; set; }
    public ETABS2016.cSapModel mySapModel16 { get; set; }

這是我的卡曼德 class:

internal class GetStoryDataFromEtabsCommand : ICommand
{
    private MainWindowViewModel _viewModel;
    public GetStoryDataFromEtabsCommand(MainWindowViewModel viewModel)
    {
        _viewModel = viewModel;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _viewModel.GetStoryDataFromEtabs();
    }
}

還有另一個與上面完全相同的命令,但調用 ConnectToEtabs() 方法

這是我的 ConnectToEtabs() 方法:

public void ConnectToEtabs()
{
    //get the active ETABS object
    myETABSObject16 = 
    (ETABS2016.cOAPI) System.Runtime.InteropServices.Marshal.GetActiveObject 
    ("CSI.ETABS.API.ETABSObject");
    //Get a reference to cSapModel to access all API classes and functions
    mySapModel16 = myETABSObject16.SapModel;
}

這是我的 GetStoryDataFromEtabs() 方法:

public void GetStoryDataFromEtabs()
{
   double BaseElev = 0;
   string[] notneededst = null;
   int NumOfStory = 0;
   double[] storyElev = null;
   double[] notneededd = null;
   Boolean[] notneededbool = null;
   int[] notneededint = null;
   ret = mySapModel16.Story.GetStories(ref NumOfStory, ref notneededst, ref 
         storyElev, ref notneededd, ref notneededbool, ref notneededst, ref 
         notneededbool, ref notneededd);
   earthQuake.NumberOfStory = NumOfStory;
   earthQuake.BuildingHeight = Math.Round((storyElev[NumOfStory] - 
   storyElev[0]), 2);
}

在 GetStoryDataFromEtabs() 方法中,mySapModel16 是 null。 另一件事:每個命令都被來自不同用戶控件的不同按鈕使用。

我認為這條線可能是你拋出錯誤的地方,你能確認一下嗎?

ret = mySapModel16.Story.GetStories(ref NumOfStory, ref notneededst, ref 
         storyElev, ref notneededd, ref notneededbool, ref notneededst, ref 
         notneededbool, ref notneededd);

我的推理有兩個,

  1. ref類型必須在它們被傳遞到函數之前被初始化。
  2. 然后,您稍后將使用其中一種引用類型:

earthQuake.BuildingHeight = Math.Round((storyElev[NumOfStory] - storyElev[0]), 2);

如果您的 function mySapModel16.Story.GetStories(…)初始化了您傳遞給它的參數,那么您應該使用out代替。

另一方面,您應該考慮讓您的 ViewModel 實現您要綁定的 ICommand 屬性並讓它觸發一個任務,例如

public ICommand GetStoryDataFromEtabsCommand{get;set;}
public bool IsConnected{get;private set;}

並在構造函數中

GetStoryDataFromEtabsCommand = new Command(()=>GetStoryDataFromEtabs(), ()=>IsConnected);

一旦您的連接 function 執行了連接,就會設置IsConnected

然后public void GetStoryDataFromEtabs()變為public Task GetStoryDataFromEtabs() 如果您發現需要很長時間,這將允許您使 function 異步並等待對mySapModel16.Story.GetStories(…)的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM