我正在使用 Xaml 为 UI 处理 Xamarin 表单项目的数据绑定(bind)。
到目前为止它非常简单:

XAML:

<?xml version="1.0" encoding="utf-8" ?>
xmlns:viewModels="clr-namespace:Watson.ViewModels;assembly=Watson"
         x:Class="Watson.Views.DeviceCheck">

<ContentPage.BindingContext>
    <viewModels:DeviceCheckViewModel/>
</ContentPage.BindingContext>

    <!--<ActivityIndicator Color="Red" IsRunning="True"
                   x:Name="loadingScreen"/>-->
<StackLayout>
    <Label Text="Checking Device.."/>

    <Button Text="page nav"
            Command="{Binding NextButton}"></Button>
</StackLayout>

背后的代码:
namespace Watson.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class DeviceCheck:ContentPage
    {

    private DeviceCheckViewModel viewModel;
    public DeviceCheck() {
        InitializeComponent();

        BindingContext = viewModel = new DeviceCheckViewModel(this.Navigation);


    }// end of constructor

}// end of class

}// end of namespace

这是尝试绑定(bind)到 View 模型并使用绑定(bind)命令在单击按钮时转到另一个页面。
我得到的错误是“字典中不存在给定的键”,这是在尝试构建时。我已将问题隔离到该行:<viewModels:DeviceCheckViewModel/>
我不知道为什么会发生此错误。

这是 View 模型:
namespace Watson.ViewModels
{
    public class DeviceCheckViewModel: INotifyPropertyChanged
    {
        public INavigation Navigation { get; set; }
        public ICommand NextButton { protected set; get; }

    public DeviceCheckViewModel(INavigation navigation)
    {
        this.Navigation = navigation;
        this.NextButton = new Command(async () => await GotoNextPage());

    }

    public async Task GotoNextPage()
    {

        await Navigation.PushAsync(new RegisterDevice());
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
    }
}
}

我走这条路的原因是坚持MVVM架构。
所以将页面导航放在后面的代码中并不是一个真正的选择。
另外请注意,所有模型、 View 模型和 View 都位于具有相同名称的文件夹结构中。

任何帮助,将不胜感激。

最佳答案

您在后面的代码中设置绑定(bind)上下文:

BindingContext = viewModel = new DeviceCheckViewModel(this.Navigation);

所以也没有必要采用 xaml 方式。这也创建了一个 DeviceCheckViewModel 实例并将其设置为绑定(bind)上下文:
<ContentPage.BindingContext>
    <viewModels:DeviceCheckViewModel/>
</ContentPage.BindingContext>

但是 ,因此它需要有一个无参数的构造函数。这可能是您获得异常的原因。

关于c# - 字典 X​​amarin 表单中不存在给定键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44308294/

10-10 16:31