我正在開發一個 Xamarin.Forms 專案。我有一個 ViewModel 用于顯示物件串列,另一個用于編輯物件。在我的 ListViewModel 中,我有一個命令,它接受一個選定的物件并將其理想地發送到 EditViewModel。嘗試構建專案時出現錯誤,顯示...
Views\EditObjectPage.xaml(9,10):XamlC 錯誤 XFC0004:缺少“MobileApp.ViewModels.EditViewModel”的默認建構式
這是我的 Views\EditObjectPage.xaml 中有問題的代碼的起點
.....
x:Class="MobileApp.Views.EditObjectPage"
xmlns:viewmodel="clr-namespace:MobileApp.ViewModels">
<!--Binding Context-->
<ContentPage.BindingContext>
<viewmodel:EditViewModel /> //offending line
</ContentPage.BindingContext>
在后面的代碼中,我有一個建構式,它從我的 ListViewModel 中的命令中獲取一個物件(注意:我嘗試添加一個空的默認建構式,但沒有任何改變)
namespace MobileApp.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class EditObjectPage : ContentPage
{
public EditObjectPage(Object object)
{
InitializeComponent();
}
}
}
我的 ListViewModel 中的命令
public ICommand EditObjectCommand { get; set; } //declaration of property
public ListViewModel()
{
...........
EditObjectCommand = new Command(async (o) => await EditObject(o));
}
private async Task EditObject(object o)
{
SelectedObject = o as Object; //SelectedObject is a working property
await Application.Current.MainPage.Navigation.PushAsync(new
EditObjectPage(SelectedObject);
}
我的 EditViewModels 建構式是
public EditViewModel(Object object)
{
_modifiedObject = object; //_modifiedObject is a private property of this class
....
}
我是 MVVM 和 Xamarin 的新手,我正在考慮通過在后面的代碼中多載建構式來嘗試使我的編輯和添加視圖和視圖模型相同,但我實際上不知道這是否可行。我意識到這可能是一種意大利面條式的代碼做事方式,因此任何輸入或鏈接都將不勝感激。
uj5u.com熱心網友回復:
這里的問題是 xaml 行:
<ContentPage.BindingContext>
<viewmodel:EditViewModel /> //offending line
</ContentPage.BindingContext>
使用視圖模型的默認建構式。解決這個問題的最簡單方法是將 ViewModel 的創建移到 View 建構式中
namespace MobileApp.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class EditObjectPage : ContentPage
{
private EditViewModel _model = null;
public EditObjectPage(Object obj)
{
InitializeComponent();
_model = new EditViewModel(obj);
this.BindingContext = _model;
}
}
}
uj5u.com熱心網友回復:
似乎缺少 MVVM 默認建構式
public ListViewModel(INavigation navigation)
{
}
uj5u.com熱心網友回復:
您可以嘗試在 EditViewModels.cs 中添加一個非引數建構式,例如:
public EditViewModel() {}
當你創建它的實體時,你仍然可以使用該new EditViewModel(Object object)方法。
更新
對不起,我的粗心,添加一個非引數建構式可以使錯誤消失,但是viewmodel永遠不會得到物件,因為xmal通過非引數建構式創建它的實體。
因此,正如 Marco Beninca 所說,您需要在頁面的建構式中創建視圖模型的實體,并在那里設定系結背景關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488540.html
