[英]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);
我的推理有兩個,
ref
類型必須在它們被傳遞到函數之前被初始化。 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.